我正在尝试设置客户端脚本以对不同域上的Web服务进行ajax调用,以使Web服务变得更加复杂。该服务是MVC4 WebApi(REST)。客户端脚本也从HTTPS域运行。我尝试拨打电话时收到“访问被拒绝”错误。例如,我有一个脚本在https://domain_a.com/clientpage/script.js运行并调用https://domain_b.com/serviceapi/method/,ajax错误回调报告Access is Denied错误。我采用了这个确切的场景并且在没有SSL的情况下进行了测试,所以http到http,然后ajax调用工作正常,我还设置了$ .support.cors = true,并且在ajax选项中也尝试了crossDomain:true。这应该适用于https,我错过了什么,或者这根本不起作用?有什么建议吗?
以下是我的ajax调用示例:
$.support.cors = true;
$.ajax({
url: requestURL,
crossDomain: true,
type: "GET",
headers: { "Authentication": "user@domain.com:" + hashcode },
data: "{}",
contentType: "application/json; charset=utf-8",
dataType: "json",
success: function (data) {
alert("call succeeded");
},
error: function (response) {
alert("call failed");
}
});
jQuery版本:1.10.2
浏览器:IE9(希望这适用于多种浏览器:chrome,firefox,safari)
Web服务:MVC4 WebAPI .NET 4.5
更新:
我做了一些测试,并排除了Web服务的问题,它似乎是底层xmlhttprequest对象或浏览器的问题。我在测试https到https场景时运行小提琴手(fiddler设置为解密https流量并且我测试了这个)并且当我尝试进行ajax调用时它没有任何流量而且它失败了。这让我相信它的浏览器。这是我测试的场景列表和结果:
http到http,相同域名:成功
http到http,不同的域名:成功
https到https,相同的域名:成功
https到https,不同的域:失败。 << - 我希望这是Web服务使用最常见的场景之一,一些ISV为从其他域调用它的客户提供服务,并且他们想要使用SSL。
答案 0 :(得分:0)
有时候在开发环境中进行开发时,大多数公司都不会为ssl证书支付费用并使用自签名证书,这会导致浏览器抛出显示警告的大红屏,你必须继续。在Chrome中我知道当你使用iframe执行此类操作时,它会崩溃iframe窗口,除非我在该会话期间接受证书。
话虽如此,你确定domain_b.com有一个有效的ssl证书吗?如果没有在浏览器会话中接受SSL证书?您可以通过手动复制ajax调用中的URL进行测试,将其粘贴到窗口中并访问它。一旦你接受了证书,就应该开始工作了。
您可能会看到如下图片:
如果是这样,请单击继续
答案 1 :(得分:0)
我没有直接解决在https上调用跨域的问题,但我确实提出了一种在我的情况下可接受的解决方法:而不是尝试直接从我构建的客户端调用跨域位于另一个域上的客户端和服务器之间的Web服务。 Web服务与客户端位于同一域中,因此客户端可以毫无困难地调用此服务。然后,Web服务使用标准HTTP通信将请求发送到远程服务器并接受响应,然后将响应返回给客户端。基本上,本地Web服务就像客户端和远程服务器之间的一种代理。