Подтвердить что ты не робот

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

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

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

Возможно ли достичь той же функциональности в Web API ApiController?

4b9b3361

Ответ 1

Веб-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.

Обычный подход в ASP.NET Web API заключается в представлении формы в качестве модели, поэтому форматор медиа-типа десериализует его. Альтернативой является определение параметра действий как NameValueCollection:

public void Post(NameValueCollection formData)
{
   var value = formData["key"];
}

Ответ 2

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

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

Ответ 3

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

public void Post(HttpRequestMessage request)
{
    NameValueCollection formData = await request.Content.ReadAsFormDataAsync();
}

Ответ 4

Попробуйте следующее:

HttpContext.Current.Request.Form["key"];