Есть ли способ обрабатывать данные сообщения формы в контроллере Web Api?

В ASP.NET MVC можно получить доступ к данным сообщения формы:

var thisData = Request.Form["this.data"];

Можно ли добиться такой же функциональности в Web API Контроллер API?


person Magnus Johansson    schedule 21.07.2012    source источник


Ответы (5)


Веб-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"];
}
person Aliostad    schedule 21.07.2012
comment
Предположим, у вас есть некоторые значения, которые были известны, а некоторые — динамические. Есть ли способ указать тип модели для известных и получить остальные в коллекции. Что-то вроде: public void Post(PostData model, NameValueCollection formData)? - person Joshua Frank; 14.03.2014
comment
Использование NameValueCollection у меня не сработало, но с FormDataCollection сработало - person Pyfhon; 30.11.2016
comment
NameValueCollection у меня тоже не сработал. Я использовал FormDataCollection как @Pyfhon. - person xabush; 19.02.2017

Ну, это невозможно, потому что 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"
        };
    }
}

Но я не уверен, что это лучший способ делать такие вещи.

person tugberk    schedule 21.07.2012

В качестве альтернативы методу Алиостада можно сделать:

public void Post(HttpRequestMessage request)
{
    NameValueCollection formData = await request.Content.ReadAsFormDataAsync();
}
person Philip Bergström    schedule 16.06.2016

Если у вас есть только 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;
}
person Nick    schedule 26.04.2018

Попробуй это:

HttpContext.Current.Request.Form["key"];
person Kevin    schedule 04.08.2017
comment
HttpContext недоступен в приложениях WebApi. - person McGuireV10; 17.12.2017