我刚刚创建了我的第一个 WCF 服务,我想与其他客户分享。我已在 IIS、Web.config 和 Global.asax 中添加了
Access-Control-Allow-Origin
标头,但仍然不允许远程客户端访问该服务。我已经在 Chrome 和 IE(我们组织支持的浏览器)中进行了测试。我的错误是“对预检请求的响应未通过访问控制检查:请求的资源上不存在“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 中:
这是尝试访问服务的 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
标头,但在远程浏览器的响应中却看不到。好像没有发送过。
来自我的本地主机的响应标头:
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 添加了自定义标头。它显示在本地主机浏览器中,但不显示在客户端上。远程浏览器中缺少
Body-Count
标头,但我在本地浏览器上看到它。
确保 Ajax URL 正确。
在发布的原始代码中,我的 Ajax 请求的 URL 正在查看 localhost,而不是托管服务的计算机的 FQDN。这就是问题所在。当然,如果该服务未托管在该 URL 上,Ajax 请求将无法工作。我被错误消息弄得心烦意乱,以至于错过了明显而简单的解决方案。
使用 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');
});
如果您仍然遇到该问题并且提供的解决方案不起作用 - 尝试重新启动 IIS 上的应用程序池: IIS --> 应用程序池 --> 回收或启动/停止