Access-Control-Allow-Origin在IIS中,但不起作用

时间:2016-05-05 14:48:17

标签: c# asp.net wcf iis cross-domain

我刚刚创建了我的第一个WCF服务,我想与其他客户分享。我在IIS,Web.config和Global.asax中添加了Access-Control-Allow-Origin标头,但仍然不允许远程客户端访问该服务。我已经在Chrome和IE(我们的org支持的浏览器)中进行了测试。我的错误是“对预检请求的响应未通过访问控制检查:请求的资源上没有'Access-Control-Allow-Origin'标头。”

在Web.config中:

<httpProtocol>
  <customHeaders>
    <add name="Access-Control-Allow-Origin" value="*" />
    <add name="Access-Control-Allow-Headers" value="Content-Type"/>
    <add name="Access-Control-Allow-Methods" value="POST,GET,OPTIONS"/>
  </customHeaders>
</httpProtocol>

在Global.asax中:

protected void Application_BeginRequest(object sender, EventArgs e)
{
    HttpContext.Current.Response.AddHeader("Access-Control-Allow-Origin", "*");

    if (HttpContext.Current.Request.HttpMethod == "OPTIONS")
    {
        //These headers are handling the "pre-flight" OPTIONS call sent by the browser
        HttpContext.Current.Response.AddHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE");
        HttpContext.Current.Response.AddHeader("Access-Control-Allow-Headers", "Content-Type, Accept");
        HttpContext.Current.Response.AddHeader("Access-Control-Max-Age", "1728000");
        HttpContext.Current.Response.End();
    }
}

这里他们在IIS中:

Screen shot of IIS

这是试图访问该服务的JavaScript。它在本地但不是远程工作:

$.ajax({
    type: "POST",
    url: "http://localhost/wsSamwise/Service1.svc/GetTime",
    data: '{"UserName": "' + userName + '"}',
    contentType: "application/json; charset=utf-8",
    dataType: "json",
    success: function(data) {
        $("#results").html(data.GetTimeResult);
        console.log(data);
    }
});

所有这些想法都来自各种Stackoverflow线程,但它们都不适用于我。我错过了什么?

编辑:我刚检查了本地主机与远程浏览器中的响应标头。我在本地主机的响应中看到Access-Control-Allow-Origin标头,但在远程浏览器的响应中没有。就好像它没有被发送一样。

来自我的localhost的响应标头:

Access-Control-Allow-Headers:Content-Type
Access-Control-Allow-Methods:POST,GET,OPTIONS
Access-Control-Allow-Origin:*
Access-Control-Allow-Origin:*
Cache-Control:private
Content-Length:82
Content-Type:application/json; charset=utf-8
Date:Thu, 05 May 2016 16:01:28 GMT
Server:Microsoft-IIS/7.5
X-AspNet-Version:4.0.30319
X-Powered-By:ASP.NET

来自远程浏览器的响应:

Allow:OPTIONS, TRACE, GET, HEAD, POST
Content-Length:0
Date:Thu, 05 May 2016 16:00:09 GMT
Public:OPTIONS, TRACE, GET, HEAD, POST
Server:Microsoft-IIS/7.5
X-Powered-By:ASP.NET

编辑2:伙计们,也许这完全是一个IIS问题。我刚刚为IIS添加了自定义标头。它出现在localhost浏览器中,但不在客户端上。远程浏览器中缺少Body-Count标头,但我在本地浏览器上看到它。

custom header

2 个答案:

答案 0 :(得分:1)

使用JSONP是使用不同域名(跨源请求共享)工作的最经典和标准。 然后查看Access-Control-Allow-Origin以添加特殊限制。

像这样使用JSONP: 新的JSONP功能通过WebHttpBinding公开。 CustomersService的配置如下所示:

 <bindings>
    <webHttpBinding>
      <binding name="webHttpBindingWithJsonP" crossDomainScriptAccessEnabled="true" />
    </webHttpBinding>
  </bindings>
  <services>
    <service name="ServiceSite.CustomersService">
      <endpoint address="" binding="webHttpBinding"
                bindingConfiguration="webHttpBindingWithJsonP" contract="ServiceSite.CustomersService"
                behaviorConfiguration="webHttpBehavior"/>
    </service>
  </services>

使用jQuery使用JSONP

 // Get the JsonP data
 $.getJSON('http://localhost:65025/CustomersService.svc/GetCustomers?callback=?', null, function (customers) {
      alert('Received ' + customers.length + ' Customers');
 });

来源: How to natively enable JSONP for existing WCF service?

答案 1 :(得分:1)

确保Ajax网址正确无误。

在发布的原始代码中,我的Ajax请求的URL查看localhost而不是托管服务的计算机的FQDN。那就是问题所在。当然,如果服务未托管在URL上,则Ajax请求将不起作用。我被错误信息分散了注意力,以至于我错过了明显而简单的解决方案。