如何解决通过HTTPS从Javascript调用WCF服务会导致访问被拒绝
|| 我编写了一个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>
我已经研究了2天了。我发现很多人说您不能跨域使用\'XMLHttpRequest \'方法,但是通过基本的http可以找到适合我的方法,因此我很难相信。我也尝试了许多不同的servicemodel配置建议,但是都没有用于https通讯。有人在我的配置或调用页面中看到导致通过https导致“访问被拒绝”响应的任何内容吗?
任何帮助,将不胜感激。
解决方法
HTML页面和服务是否符合“同源政策”?
域名必须相同,包括子域(例如,您不能在test2.example.com的页面上加载test1.example.com上托管的文件)。
协议(例如
http
或https
)必须相同。
端口必须相同(例如,您不能从example.com的页面加载example.com:8080的文件)。
所有AJAX请求都必须符合此政策-否则,如@Mike Miller所建议,您可能需要查看JSONP。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。