如何使用MVC4和WebAPI项目阻止同源访问策略?

时间:2012-11-29 19:47:10

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

我以前曾问过类似的问题,但我终于找到了问题的根源。我在VS 2010中有两个项目的解决方案。一个项目是一个mvc 4应用程序,它对第二个WebAPI项目进行休息调用,现在即使这些项目在同一个解决方案中,当使用除I.E之外的任何东西时,我得到同源策略错误。我相信这与每个项目在一个单独的开发服务器实例上启动这一事实有关,但我不确定。

有人可以向我解释一个解决方案,我可以让这两个项目运行而不会遇到相同的原始错误吗? (相关的问题,如果我想将我的api暴露给公众使用,怎么会有人使用它而不会得到同样的错误?)

2 个答案:

答案 0 :(得分:3)

您需要在主MVC4应用程序中创建一个瘦代理层,以便对您的WebAPI项目进行HttpRequestWebClient调用。

因此,您的Javascript会调用类似

的内容
http://samedomain/proxy/getproduct/29

然后,您的ProxyController的GetProduct操作应该对实际的WebAPI URL进行HttpRequest调用

http://otherdomain/api/Product/29

然后将JsonResult返回到调用的Javascript,然后您可以使用它。由于您的Javascript和代理层位于同一个域中,因此您不会遇到原始访问策略问题。

编辑:即使你在本地主机上同时使用不同的端口,但就浏览器而言,它们都算作一个单独的域。从localhost:41928到localhost:58128的呼叫将受此安全策略的约束。如果您试图解决这个问题,那么您需要将MVC WebAPI放在主项目中。要组合这两个项目,请创建一个新的MVC WebAPI项目 - 它包含服务路由以及常规MVC路由。


如果您想要真正“开放”的WebAPI服务,可以关注this guide to enable CORS。在IIS7中,您可以将其添加到web.config文件

<?xml version="1.0" encoding="utf-8"?>
<configuration>
 <system.webServer>
   <httpProtocol>
     <customHeaders>
       <add name="Access-Control-Allow-Origin" value="*" />
     </customHeaders>
   </httpProtocol>
 </system.webServer>
</configuration>

答案 1 :(得分:1)

我最终做了什么,对我有用,现在使用IIS Express并将项目指向同一个虚拟目录