В ASP.NET MVC
можно получить доступ к данным сообщения формы:
var thisData = Request.Form["this.data"];
Можно ли добиться такой же функциональности в Web API
Контроллер API?
В ASP.NET MVC
можно получить доступ к данным сообщения формы:
var thisData = Request.Form["this.data"];
Можно ли добиться такой же функциональности в Web API
Контроллер API?
Веб-API ASP.NET стал значительно более надежным при работе с различными сценариями HTTP, особенно с потоковой передачей. Таким образом, только форматировщики медиа-типа обычно касаются содержимого и должны обеспечивать согласованность содержимого.
В ASP.NET MVC тип контента application/x-www-form-urlencoded
является гражданином первого класса (и к нему относятся особенно потому, что это тип контента 95% запросов POST), и у нас есть FormsCollection
для предоставления доступа к словарю всякий раз, когда он определен как входной параметр.
В веб-API ASP.NET application/x-www-form-urlencoded
— это еще один тип контента, который должен быть прочитан его MediaTypeFormatter. Таким образом, веб-API ASP.NET не может делать никаких предположений о Forms
.
Обычный подход в веб-API ASP.NET заключается в представлении формы в виде модели, чтобы средство форматирования типа мультимедиа десериализовало ее. Альтернативой является определение параметра действия как NameValueCollection
:
public void Post(NameValueCollection formData)
{
var value = formData["key"];
}
public void Post(PostData model, NameValueCollection formData)
?
- person Joshua Frank; 14.03.2014
Ну, это невозможно, потому что HttpRequestMessage
не предоставляет такую коллекцию из коробки.
Однако, если ваше приложение размещено под ASP.NET, вы можете перейти к текущему объекту HttpContext
и получить оттуда значения формы:
public class CarsController : ApiController {
public string[] Get() {
var httpContext = (HttpContextWrapper)Request.Properties["MS_HttpContext"];
var foo = httpContext.Request.Form["Foo"];
return new string[] {
"Car 1",
"Car 2",
"Car 3"
};
}
}
Но я не уверен, что это лучший способ делать такие вещи.
В качестве альтернативы методу Алиостада можно сделать:
public void Post(HttpRequestMessage request)
{
NameValueCollection formData = await request.Content.ReadAsFormDataAsync();
}
Если у вас есть только HttpRequestMessage
, у вас есть несколько вариантов:
Ссылаясь на System.Net.Http.Formatting
, вы можете использовать ReadAsFormDataAsync()
метод расширения.
var formData = await message.Content.ReadAsFormDataAsync();
Если вы не хотите включать эту библиотеку, вы можете сделать то же самое вручную, используя вспомогательный класс HttpUtility
в System.Web
.
public async Task<NameValueCollection> ParseFormDataAsync(HttpRequestMessage message)
{
string formString = await message.Content.ReadAsStringAsync();
var formData = HttpUtility.ParseQueryString(formString);
return formData;
}
Попробуй это:
HttpContext.Current.Request.Form["key"];