27

ASP.NET MVC中,可以访问表单发布数据:

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

Web API 是否可以在ApiController中实现相同的功能?

4

5 回答 5

36

ASP.NET Web API 在处理不同的 HTTP 场景(尤其是流式传输)方面变得更加健壮。因此,只有媒体类型格式化程序通常会接触内容并且必须使内容保持一致。

在 ASP.NET MVC 中,application/x-www-form-urlencoded内容类型是一等公民(并且特别对待,因为这是 95% 的 POST 请求的内容类型)并且我们必须在FormsCollection访问中提供字典访问,只要它被定义为输入参数.

在 ASP.NET Web API 中,application/x-www-form-urlencoded是另一种内容类型,应该由其 MediaTypeFormatter 读取。因此 ASP.NET Web API 不能对Forms.

ASP.NET Web API 中的常规方法是将表单表示为模型,以便媒体类型格式化程序对其进行反序列化。另一种方法是将动作的参数定义为NameValueCollection

public void Post(NameValueCollection formData)
{
   var value = formData["key"];
}
于 2012-07-21T18:16:18.377 回答
19

好吧,这是不可能的,因为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"
        };
    }
}

但我不确定这是否是做这类事情的最佳方式。

于 2012-07-21T18:16:31.883 回答
5

作为 Aliostad 方法的替代方案,可以执行以下操作:

public void Post(HttpRequestMessage request)
{
    NameValueCollection formData = await request.Content.ReadAsFormDataAsync();
}
于 2016-06-16T11:16:18.817 回答
1

如果你只有一个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;
}
于 2018-04-26T16:15:01.510 回答
-1

尝试这个:

HttpContext.Current.Request.Form["key"];
于 2017-08-04T13:54:05.687 回答