消除ASP.NET网站和ASP.NET WebAPI的跨域/子域OPTIONS请求

时间:2013-03-01 07:48:12

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

我有一个ASP.Net MVC 4 Website和另一个ASP.Net Web API项目。目前两者都托管在不同的域上。我正在使用amplify.js在我的前端使用API​​。因为这两个网站都托管在当我从API调用UI时,我总是一个跨域请求(我正在利用CORS来实现此目的。)。这会导致每个域OPTIONS的额外请求HTTP API打电话给我,这增加了开销。我也尝试在子域上托管这两个网站,但仍然有OPTIONS请求,我想摆脱这些额外的请求。

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

2 个答案:

答案 0 :(得分:3)

  

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

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

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

答案 1 :(得分:1)

要防止跨域请求,源域和目标域必须完全相同:在主机,域和端口(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(如果你关心它。)
  5. 我会选择一种或三种方式,因为脚本解决方案只是感觉太笨拙;)我还建议检查是否真的有必要在不同的域上运行API和网站。 OPTIONS标头通常不会产生太多开销,因此您可能会考虑首先优化代码的其他部分。

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

相关问题