用于XmlHttpRequest的Web API的CORS

时间:2012-10-04 17:00:06

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

只是想知道ASP.NET WebAPI中处理CORS(跨源资源共享)的最优雅的方式(目前可用)是什么,所以我可以在多个域上使用XmlHttpRequest?我如何将这种方法集成到每种类型的请求(GEt,POST等)的标题中,还有OPTIONS?

谢谢!

5 个答案:

答案 0 :(得分:6)

Tpeczek有一个很好的发现,但是在做我自己的研究时,我发现了一些类似的,也是非常优雅的处理CORS的方法,使你能够在App_Start文件夹的配置文件中配置你的CORS。它全部使用名为Thinkecture的开源库处理。详情请见:

http://brockallen.com/2012/06/28/cors-support-in-webapi-mvc-and-iis-with-thinktecture-identitymodel/

它有许多优点..您可以配置起源,方法(GET,POST等),访问特定控制器和操作,还可以保持控制器清除任何属性。

支持WebAPI,IIS和ASP.NET MVC!

答案 1 :(得分:3)

Carlos Figueira有很多关于CORS和ASP.NET Web API的帖子:

我个人非常喜欢 Take 2 方法,因为EnableCors属性可以轻松扩展,让您可以控制允许的来源。

答案 2 :(得分:3)

在web.config文件中添加以下内容(在system.webserver元素内)。

<httpProtocol>
      <customHeaders>
        <add name="Access-Control-Allow-Headers" value="accept, maxdataserviceversion, origin, x-requested-with, dataserviceversion" />
        <add name="Access-Control-Allow-Origin" value="*" />
        <add name="Access-Control-Max-Age" value="1728000" />
      </customHeaders>
    </httpProtocol>

并在global.aspx.cs文件中添加以下代码

    protected void Application_BeginRequest(object sender, EventArgs e)
    {
        if (Request.Headers.AllKeys.Contains("Origin") && Request.HttpMethod == "OPTIONS")
        {
            Response.StatusCode = 200;
            Response.End();
        }
    }

答案 3 :(得分:2)

现在在web api的每晚都有CORS支持

http://blogs.msdn.com/b/yaohuang1/archive/2013/04/05/try-out-asp.net-web-api-cors-support-using-the-nightly-builds.aspx

使用nuget

  • 卸载Microsoft.AspNet.Mvc.FixedDisplayModes包。
  • 从夜间版本
  • 安装Microsoft.AspNet.WebApi.Cors包

然后修复web.config中的绑定 然后启用CORS

config.EnableCors(new EnableCorsAttribute()) 

在此维基https://aspnetwebstack.codeplex.com/wikipage?title=CORS%20support%20for%20ASP.NET%20Web%20API&referringTitle=Specs

上阅读有关它的更多信息

编辑19-04-2013 Scott Guthrie在博文中写道:http://weblogs.asp.net/scottgu/archive/2013/04/19/asp-net-web-api-cors-support-and-attribute-based-routing-improvements.aspx

答案 4 :(得分:0)

这取决于你想要控制CORS的细粒度。例如,如果要允许任何域,可以通过在IIS中配置静态CORS头来为所有响应添加静态CORS头。我选择了这种方法和wrote about it here