跨域请求ASP.NET Web API

时间:2014-03-05 14:45:47

标签: javascript jquery asp.net asp.net-web-api cors

我对ASP.NET Web API中的cors实现有疑问。 我转向SO的原因是我尝试到处寻找,并找到了很多教程和答案,但这些似乎都不适合我。


设定:

  • 在XAMPP上运行的Web应用程序(HTML5,JS)(192.168.1.101:8080)
  • 在IIS Express上运行的API(ASP.net)(与VS2013集成)(192.168.1.101:52126)

Web应用程序对API进行ajax调用,如下面的代码块所示。

$.ajax({
    data: JSON.stringify(data),
    type:  'POST',
    url:   'http://localhost:52126/api/controller/action',
    dataType: 'json',
    contentType: 'application/json',
    processData: false,
    headers:
    {
        "Authorization": "Basic Base64Encrpytion"
    },
    success: function(data)
    {
        // Handle success
    },
    error: function(data)
    {
        // Handle error
    }
});

这一切都完美适用于 localhost ,包括OPTION预检。但是,当我从同一本地网络中的其他设备启动Web应用程序时,如果预检失败,则预检失败并且当然也会取消其他呼叫。


错误:

尝试使用Web应用程序从同一网络中的其他设备(192.168.1.100)查询API时,会生成以下响应:

控制台

OPTIONS http://192.168.1.101:52126/api/controller/action 400 (Bad Request)
OPTIONS http://192.168.1.101:52126/api/controller/action No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://192.168.1.101:8080/' is therefore not allowed access.
XMLHttpRequest cannot load http://192.168.1.101:52126/api/controller/action. No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'http://192.168.1.101:8080/' is therefore not allowed access.

响应标题

Connection: close
Content-Length: 334
Content-Type: text/html; charset=us-ascii
Date: Wed, 05 Mar 2014 09:29:46 GMT
Server: Microsoft-HTTPAPI/2.0

在localhost上测试Web应用程序和API时,响应标头 包含 Access-Control-Allow-Origin“*”标头。


我尝试过的解决方案:

将以下代码添加到需要从域外部到达的每个类。

[EnableCors(origins: "*", headers: "*", methods: "*")]

将以下代码添加到Web.config文件中。

<httpprotocol>
  <customheaders>
    <add name="Access-Control-Allow-Origin" value="*"></add>
  </customheaders>
</httpprotocol>

将以下代码添加到WebApiConfig文件中。

var cors = new EnableCorsAttribute("*", "*", "*");
config.EnableCors(cors);

将以下代码添加到applicationhost.config

<binding protocol="http" bindingInformation="192.168.1.101:52126:*" />

以下设置设为true

jQuery.support.cors = true

我也试图覆盖预检处理程序,但这似乎也失败了。

1 个答案:

答案 0 :(得分:2)

在这个问题上浪费了两天,我想我已经解决了。

由于我在公司网络中的工作站上开发,因此我没有本地管理员权限。这意味着我必须以管理员模式运行Visual Studio 2013。 That way IIS Express can run on the network instead of only localhost.

在applicationhost.config中,我执行了以下操作:

<binding protocol="http" bindingInformation="*:50157:localhost" />
<binding protocol="http" bindingInformation="*:50157:192.168.1.101" />

这显然是失败的,因为它们都被分配到同一个端口。所以我把它改为:

<binding protocol="http" bindingInformation="*:50157:localhost" />
<binding protocol="http" bindingInformation="*:50158:192.168.1.101" />

<强> TL; DR

  • 确保以管理员模式运行Visual Studio或仅获取本地管理员权限。
  • 为每个IP使用不同的端口。