通过HTTPS从Javascript调用WCF服务会导致访问被拒绝

通过HTTPS从Javascript调用WCF服务会导致访问被拒绝,javascript,wcf,service,https,access-denied,Javascript,Wcf,Service,Https,Access Denied,我编写了一个返回JSON响应的WCF服务。然后我用一些JavaScript代码创建了一个html页面来测试函数。当我将服务发布到登台环境(使用SSL模拟生产环境)时,我必须更新服务的web.config文件以通过HTTPS工作。当我直接浏览到.svc端点(服务页面以http和https显示)以及在浏览器中调用服务(系统提示我下载JSON响应)时,一切似乎都正常。但是,当我将测试页面更改为指向https版本时,会出现“拒绝访问”错误 以下是我的配置文件的servicemodel部分的代码: <

我编写了一个返回JSON响应的WCF服务。然后我用一些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>

函数api_test(){
变量url=”https://test.mydomain.com/Services/PromotionCodeGeneration.svc/contest/useremail@mydomain.com”;
var client=new XMLHttpRequest();
client.open(“GET”,url,false);
客户端.setRequestHeader(“身份验证密钥”,“LK589-JIJO-SHG9-0987-65TG-HJKU-Y$GH”);
client.send();
var responseText=client.responseText;
var result=JSON.parse(responseText);
document.writeln(“Id:+result.Id+”
); document.writeln(“代码:+result.Code+”
); var expiryDate=“”; 如果(result.Expires!=null){expireydate=result.Expires;} 文件写入(“到期:+expiryDate+”
); document.writeln(“状态:+result.Status+”
); }
我已经研究这个问题两天了。我发现很多人说不能跨域使用“XMLHttpRequest”方法,但它在基本http上对我有效,所以我觉得很难相信。我还尝试了许多不同的servicemodel配置建议,但是没有一个适合https通信。是否有人在我的配置或调用页面中看到任何导致https上的“拒绝访问”响应的内容


任何帮助都将不胜感激。

HTML页面和服务是否符合要求

  • 域名必须相同,包括子域(例如,您无法在test2.example.com的页面中加载托管在test1.example.com上的文件)

  • 协议(例如
    http
    https
    )必须相同

  • 端口必须相同(例如,不能从example.com页面加载example.com:8080上的文件)


所有AJAX请求都需要满足此策略-否则,正如@Mike Miller所建议的,您可能需要查看。

提到多个域,我觉得没有托管在同一个域上?对吗?这并不是说你想看看jsonp——谢谢你的建议阅读——我来看看。这项服务最终将托管在我们的一个公司网站上(希望是我们的一个SSL域),并由facebook上托管的flash应用程序访问。目前,我正在本地机器上托管测试页面,并在后台服务器上访问服务。它可以在http上正常工作,但当我尝试通过https访问它时,会出现拒绝访问错误。如果它是不同的域,为什么它通过http工作?看起来你们在跨域问题上是对的-它一定是通过http从我的本地主机工作的,因为我和web服务器在同一个网络域上,即使它没有出现在本地主机url中。然后将主机更改为https违反了同源策略。当我将测试文件移动到web服务器时,最初我认为这对Facebook上最终的Flash客户端来说可能是个问题,但后来发现Adobe提出了一个策略文件概念,在服务目录中放置一个xml策略文件,允许通信。我不知道如何在此评论中发布链接(取消添加功能),但如果您使用谷歌搜索“adobe跨域策略”,第一个结果应该是指向adobe页面的链接,描述策略文件概念及其规范。