【问题标题】:How can I prevent the same-origin-access-policy with MVC4 and WebAPI projects?如何防止 MVC4 和 WebAPI 项目的同源访问策略?
【发布时间】:2026-01-27 10:55:02
【问题描述】:

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

有人可以向我解释一个解决方案,让我可以同时运行这两个项目而不会遇到相同的来源错误吗? (相关的问题,如果我想公开我的 api 以供公众使用,怎么会有人使用它而不会出现同样的错误?)

【问题讨论】:

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


    【解决方案1】:

    您将需要在您的主 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>
    

    【讨论】:

    • 这些项目已经在同一个域中,这就是我感到困惑的地方。它们在不同的 asp.net 开发服务器实例中运行是问题吗?
    • 是的,当它们位于不同的端口号上时,将被视为另一个域。我会在我的回答中澄清。
    • 好吧,我原以为是这样,我已经启用了 cors(或者我是这么认为的),但我会再次运行它。是否可以在同一个实例上运行它们,或者只是致力于启用 cors?
    • 按照说明实现了 cors 并没有做任何有用的事情,所以必须使用代理,看起来像
    • 就“原则”而​​言,这种方式可能会更好,因为您将客户端和服务分开,它将定义两者之间的边界,让您的服务可以向公众公开。
    【解决方案2】:

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

    【讨论】:

      最近更新 更多