当Content-Type是text / plain时,如何让.NET MVC绑定POST参数

时间:2013-11-08 20:52:46

标签: c# asp.net-mvc asp.net-mvc-3 cors

我有一个IE8/IE9 CORS request using XDomainRequest类型的POST进入ASP .NET MVC 3 Web应用程序。链接的博客帖子表明:

  

请求的Content-Type标头仅支持text / plain

现在,由于Content-Type是text/plain并且这超出了我的控制范围,因此MVC框架不会绑定POST内容参数​​。当Content-Typeapplication/x-www-form-urlencoded时,它似乎只会绑定它们。

我无法从Request对象中读取参数。

我需要找到一种方法让MVC绑定这些参数。我考虑过尝试修改Content-Type上请求的Application_BeginRequest,但这不起作用。

Content-Typetext/plain时,如何让MVC框架绑定POST参数?


更新

我相信参数将通过Request.InputStream属性提供。我正在寻找一种使用MVC框架默认绑定来一般绑定这些参数的方法。我不想为我的项目中的每个模型编写模型绑定器。

2 个答案:

答案 0 :(得分:4)

检查是否:

  • 你真的要发送一个x-www-form-urlencoded。也许你正在发送JSON?
  • 响应包括Access-Control-Allow-Origin标头

我尝试了以下内容并且有效:

public class MvcApplication : System.Web.HttpApplication
{
    protected void Application_BeginRequest()
    {
        if (String.IsNullOrEmpty(Context.Request.ContentType) && Context.Request.HttpMethod == "POST")
        {
            Context.Request.ContentType = "application/x-www-form-urlencoded";
        }
    }

    protected void Application_EndRequest()
    {
        Context.Response.AddHeader("Access-Control-Allow-Origin", "*");
    }
}

注意:为了更好的模块化,您可能希望将Application_BeginRequest实现为HTTP模块,将CORS(Access-Control-Allow-Origin)实现为ActionFilter

答案 1 :(得分:1)

在这个主题上没有真正的经验,但在这里你可以看到一些可以帮助你的方法。

检查此SO问题和解决方法:

以下是在ASP.NET WebAPI中完成的方法:

http://www.asp.net/web-api/overview/security/enabling-cross-origin-requests-in-web-api