Вызов службы WCF из Javascript через HTTPS приводит к отказу в доступе - PullRequest
1 голос
/ 10 июня 2011

Я написал службу WCF, которая возвращает ответ JSON.Затем я создал HTML-страницу с некоторым кодом JavaScript для проверки функции.Когда я опубликовал сервис в промежуточной среде (в которой для эмуляции рабочей среды используется 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, поэтому мне трудно в это поверить.Я также пробовал МНОГИЕ различные предложения по конфигурации сервисной модели, однако ни один не работал для связи https.Кто-нибудь видит в моей конфигурации или на странице вызова что-нибудь, что вызывает ответ «Отказано в доступе» через https?

Любая помощь будет признательна.

1 Ответ

2 голосов
/ 10 июня 2011

Соответствуют ли HTML-страница и служба правилам Same Origin ?

  • Имя домена должно совпадать, включая:субдомены (поэтому вы не можете, например, загрузить файл, размещенный на test1.example.com на странице test2.example.com).

  • Протокол (например, http или https) должен совпадать.

  • Порт должен совпадать (например, вы не можете загрузитьфайл на example.com: 8080 со страницы на example.com).

Все запросы AJAX должны соответствовать этой политике - в противном случае, как предложил @Mike Miller, вам можетпосмотрите на JSONP .

...