【问题标题】:Eliminate cross domain/sub domain OPTIONS request for ASP.NET Website and ASP.NET WebAPI消除对 ASP.NET 网站和 ASP.NET WebAPI 的跨域/子域 OPTIONS 请求
【发布时间】:2013-02-15 16:06:52
【问题描述】:

我有一个 ASP.Net MVC 4 Website 和另一个 ASP.Net Web API 项目。目前两者都托管在不同的域上。我正在使用 amplify.js 在我的前端使用 API。由于两个网站都托管在不同的域上,因此它总是一个跨域当我从UI 调用我的API 时请求(我为此目的使用CORS。)。这会导致我对每个HTTP API 调用产生额外的OPTIONS 请求,这会增加开销。我也试过在子域上托管这 2 个网站,但 OPTIONS 请求仍然存在,我想摆脱这些额外的请求。

有什么方法可以消除OPTIONS 请求?

【问题讨论】:

    标签: c# asp.net-mvc-4 asp.net-web-api cors amplifyjs


    【解决方案1】:

    有什么方法可以消除 OPTIONS 请求?

    您可以使用 JSONP 代替 CORS。不幸的是,这对于您的场景可能还不够,因为 JSONP 仅适用于 GET 请求(jQuery 的 $.ajax 方法有此限制)。

    或者,如果您将 2 托管在同一个域上并且您没有违反 same origin policy,则可以使用正常的 AJAX 请求。

    【讨论】:

    • 能否请您提供任何参考,我可以从哪里开始这样做?
    • 哪一个? JSONP?正如我在回答中解释的那样,它有一些限制,例如您可以使用的 HTTP 动词。这是你想做的事情吗?如果是,那么您可以查看以下帖子:stackoverflow.com/questions/9421312/jsonp-with-asp-net-web-api
    • 这是我使用 POST、PUT 和 DELETE 以及 GET 请求的一个问题
    • 好吧,在这种情况下,您必须在同一个域上托管您的 Web API 并使用标准 AJAX 请求。没有其他办法。
    • 不,这是不可能的。您违反了同源政策。请阅读我链接到的文章:en.wikipedia.org/wiki/Same_origin_policy 如果你想让它工作,你应该尊重这个政策,即你的应用程序必须托管在 website.domainname.comwebsite.domainname.com/api 例如。
    【解决方案2】:

    为防止跨域请求,源域和目标域必须完全相同:在主机、域和端口中 (same origin policy)。但是,无论如何,您有一些选项可以防止 CORS:

    1. 将网站和 API 放在同一个域中 - 有点明显 ;)
    2. 创建某种服务器端代理脚本(PHP、Node.js 或任何您喜欢的),通过 curl 或任何类似于 API 的方式路由请求。这应该阻止 OPTIONS 标头,但需要另一个 HTTP 请求(AJAX 网站 httpd API httpd)。
    3. 类似的解决方案是使用 Apache 作为反向代理 (howto here)。与脚本解决方案一样,这也会产生两个 HTTP 请求,但我假设反向代理会导致更少的开销。
    4. 您也可以使用JSONP,但API 需要支持它(因此您可能需要重新实现网站API 通信)并且您的API 将不再是RESTful(如果您关心它的话) )。

    我会选择一种方式或方式三种方式,因为脚本解决方案感觉太笨拙了;)我还建议检查是否真的有必要在不同的域上运行 API 和网站。 OPTIONS 标头通常不会造成太多开销,因此您可以考虑先优化代码的其他部分。

    也许您可以将网站和 API 放在一个域中,而仅将 API 的数据库放在另一台服务器上?只是一个想法......

    【讨论】:

      猜你喜欢
      • 2023-03-09
      • 1970-01-01
      • 2011-10-08
      • 2011-08-23
      • 2014-10-29
      • 2016-06-30
      • 2018-09-14
      • 1970-01-01
      • 2021-09-11
      相关资源
      最近更新 更多