有没有办法在Web Api控制器中处理表单发布数据?

时间:2012-07-21 15:48:45

标签: asp.net asp.net-web-api

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

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

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

5 个答案:

答案 0 :(得分:34)

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"];
}

答案 1 :(得分:18)

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

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

答案 2 :(得分:5)

作为Aliostad方法的替代方案,可以做到:

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

答案 3 :(得分: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;
}

答案 4 :(得分:-1)

试试这个:

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