通过HTTPS从Javascript调用WCF服务会导致访问被拒绝
Calling WCF service from Javascript over HTTPS results in Access Denied
我编写了一个WCF服务,该服务返回JSON响应。然后,我用一些JavaScript代码创建了一个html页面来测试该功能。当我将服务发布到临时环境(该环境使用SSL来模拟生产环境)时,我必须更新服务的web.config文件以通过HTTPS工作。当我直接浏览到.svc端点(服务页面同时显示为http和https)时,以及当我在浏览器中调用服务(系统会提示我下载JSON响应)时,一切似乎都很好,但当我将测试页面更改为指向https版本时,我会收到"拒绝访问"错误。
以下是我的配置文件servicemodel部分的代码:
<system.serviceModel>
<services>
<service name="Services.PromotionCodeGeneration" behaviorConfiguration="md">
<endpoint address="" binding="webHttpBinding" contract="Services.IPromotionCodeGeneration" behaviorConfiguration="webHttp" bindingConfiguration="webBindingSecure"/>
<endpoint address="" binding="webHttpBinding" contract="Services.IPromotionCodeGeneration" behaviorConfiguration="webHttp" bindingConfiguration="webBinding"/>
<endpoint contract="IMetadataExchange" binding="mexHttpBinding" address="mex" />
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior name="md">
<serviceMetadata httpsGetEnabled="true" />
</behavior>
</serviceBehaviors>
<endpointBehaviors>
<behavior name="webHttp">
<webHttp />
</behavior>
</endpointBehaviors>
</behaviors>
<bindings>
<webHttpBinding>
<binding name="webBindingSecure">
<security mode="Transport"/>
</binding>
<binding name="webBinding">
<security mode="None"></security>
</binding>
</webHttpBinding>
</bindings>
</system.serviceModel>
这是我测试页面上的代码:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" >
<head>
<title></title>
<script>
function api_test() {
var url = "https://test.mydomain.com/Services/PromotionCodeGeneration.svc/contest/useremail@mydomain.com";
var client = new XMLHttpRequest();
client.open("GET", url, false);
client.setRequestHeader("Authentication-Key", "LK589-JIJO-SHG9-0987-65TG-HJKU-Y$GH");
client.send();
var responseText = client.responseText;
var result = JSON.parse(responseText);
document.writeln("Id: " + result.Id + "<br/>");
document.writeln("Code: " + result.Code + "<br/>");
var expiryDate = "";
if (result.Expires != null){expiryDate = result.Expires;}
document.writeln("Expires: " + expiryDate + "<br/>");
document.writeln("Status: " + result.Status + "<br/>");
}
</script>
</head>
<body onload="api_test();">
</body>
</html>
我已经研究这个问题两天了。我发现很多人说你不能跨域使用"XMLHttpRequest"方法,但它在基本的http上对我来说是有效的,所以我觉得这很难相信。我也尝试过许多不同的服务模型配置建议,但没有一个适用于https通信。有人在我的配置或调用页面中看到任何导致https上"拒绝访问"响应的内容吗?
如有任何帮助,我们将不胜感激。
HTML页面和服务是否符合同源策略?
-
域名必须相同,包括子域(例如,您无法在test2.example.com的页面中加载test1.example.com上托管的文件)。
-
协议(例如
http
或https
)必须相同。 -
端口必须相同(例如,您不能从example.com的页面加载example.com:8080的文件)。
所有AJAX请求都需要满足此策略——否则,正如@Mike Miller所建议的,您可能需要查看JSONP。
- Facebook FB.init”;访问被拒绝”;在Internet Explorer 11中
- Node.js solrProxy访问被拒绝
- 使用jquery创建dom元素会导致ie9出现拒绝访问错误
- "访问被拒绝”;当试图在IE11中打开为程序生成的PDF生成的URL时
- IE9”;访问被拒绝”;访问IFrame时出错
- Jquery 脚本错误“访问被拒绝”
- 脚本 5:访问被拒绝 ie8.在 IE11 中使用 IE8 模拟器
- 错误:在 Firefox 中访问 AJAX 请求的属性“nodeType”的权限被拒绝
- XDomainRequest (CORS) for XML 导致 IE8 / IE9 中的“访问被拒绝”错误
- 访问iframe中的facebook页面被拒绝
- Xmlhttprequest返回仅在IE上拒绝访问
- Soundcloud API错误NS_Error_DOM_BAD_URI:拒绝访问受限URI(JavaScript)
- 如何同步检测用户是否拒绝访问地理位置数据
- 访问属性的权限被拒绝'filepicker_comm_iframe'
- 访问拒绝IE8上传提交javascript
- XDomainRequest open("get", url)在IE中给出访问拒绝错误
- IE8的访问拒绝错误信息
- 在window.moveTo()上出现访问拒绝错误
- 使用gapi.auth.authorize时出现访问拒绝错误
- 页面部分加载时出现Javascript访问拒绝错误-为什么?