用于 XmlHttpRequest 的带有 WebAPI 的 CORS
Posted
技术标签:
【中文标题】用于 XmlHttpRequest 的带有 WebAPI 的 CORS【英文标题】:CORS with WebAPI for XmlHttpRequest 【发布时间】:2012-09-25 18:39:18 【问题描述】:只是想知道在 ASP.NET WebAPI 中处理 CORS(跨源资源共享)的最佳优雅方式(当前可用)是什么,以便我可以在多个域上使用 XmlHttpRequest?我如何将其集成到每种类型的请求(GET、POST 等)的标头中也可以使用 OPTIONS?
谢谢!
【问题讨论】:
跨域资源共享 【参考方案1】:这取决于您想要控制 CORS 的细粒度。例如,如果您想允许任何域,您可以通过在 IIS 中配置它们来将静态 CORS 标头添加到所有响应中。我选择了这种方法和wrote about it here。
【讨论】:
【参考方案2】:Carlos Figueira 有一系列关于 CORS 和 ASP.NET Web API 的精彩博文:
Implementing CORS support in ASP.NET Web APIs Implementing CORS support in ASP.NET Web APIs – Take 2 CORS support in ASP.NET Web API – RC version我个人是 Take 2 方法的忠实拥护者,因为 EnableCors
属性可以轻松扩展以让您控制允许的来源。
【讨论】:
有趣.. 但是我想我找到了更好的东西,可以满足我的需求,并且更多地看我的答案。【参考方案3】: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!
【讨论】:
【参考方案4】:现在在 web api 的 nightly 中支持 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 包。 从 nightly 版本中安装 Microsoft.AspNet.WebApi.Cors 包然后修复 web.config 中的绑定 然后启用 CORS
config.EnableCors(new EnableCorsAttribute())
在此 wiki https://aspnetwebstack.codeplex.com/wikipage?title=CORS%20support%20for%20ASP.NET%20Web%20API&referringTitle=Specs了解更多信息
2013 年 4 月 19 日编辑 Scott Guthrie 曾在博客中介绍过它:http://weblogs.asp.net/scottgu/archive/2013/04/19/asp-net-web-api-cors-support-and-attribute-based-routing-improvements.aspx
【讨论】:
web api 文档中添加了一个新教程。他们已将 nigtly cors 更改集成到主要的 nuget 存储库中。 asp.net/web-api/overview/security/…【参考方案5】:在 web.cofig 文件中添加以下内容(在 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();
【讨论】:
以上解决方案对我有用。但是“OPTIONS”请求在第一时间发送到服务器。以上是关于用于 XmlHttpRequest 的带有 WebAPI 的 CORS的主要内容,如果未能解决你的问题,请参考以下文章