WCF через IIS через балансировщик нагрузки сообщает неверный базовый адрес - PullRequest
8 голосов
/ 23 октября 2010

Я пытаюсь запустить службу WCF через SSL на IIS 6 через балансировщик нагрузки.Моя первоначальная проблема была очевидной и довольно хорошо обсуждаемой - адрес, показанный на странице WSDL, указывал на https://SERVERNAME/WebServices/mydomainws.svc вместо www.mydomain.com.Ответом на эту проблему является добавление значения заголовка узла в IIS.Я сделал это, и это сработало ... вроде.Теперь я получаю http : //www.mydomain.com/WebServices/mydomainws.svc при просмотре wsdl в браузере.Если я нажму на эту ссылку (не-ssl), я получу определение сервиса, которое снова ссылается на имя сервера.

Следующее, часто рекомендуемое средство защиты - это использование WCF Extras , которое предоставляет расширение, позволяющее указать базовый адрес.Но установка этой записи конфигурации только обновила адрес soap12 :.Адрес EndPointReference по-прежнему использует имя компьютера.

Подводя итог: WSDL при просмотре в веб-браузере по адресу https://www.mydomain.com/WebServices/mydomainws.svc: http : //www.mydomain.com/WebServices/mydomainws.scv

НажатиеПриведенная выше ссылка приводит меня к реальному файлу wsdl со следующей записью службы:

https://ServerName/WebServices/mydomainws.svc

Мой файл конфигурации сервера имеет следующееЗаписи serviceModel:

<system.serviceModel>
    <bindings>
        <wsHttpBinding>
            <binding name="TransportSecurity">
                <security mode="Transport">
                    <message clientCredentialType="None"/>
                    <transport clientCredentialType="None"/>
                </security>
            </binding>
        </wsHttpBinding>
    </bindings>
    <services>
        <service name="mydomain.ws.mydomainws" behaviorConfiguration="mydomainwsBehavior">
            <!-- Service Endpoints -->
            <endpoint address="" **behaviorConfiguration="CorrectEndPoint"** binding="wsHttpBinding" bindingConfiguration="TransportSecurity" contract="mydomain.ws.Imydomainws"/>
            <endpoint address="mex" **behaviorConfiguration="CorrectEndPoint"** binding="mexHttpsBinding" contract="IMetadataExchange"/>
        </service>
    </services>
    <behaviors>
        <serviceBehaviors>
            <behavior name="mydomainwsBehavior">
                <!-- To avoid disclosing metadata information, set the value below to false and remove the metadata endpoint above before deployment -->
                <serviceMetadata httpGetEnabled="true" />
                <!-- To receive exception details in faults for debugging purposes, set the value below to true.  Set to false before deployment to avoid disclosing exception information -->
                <serviceDebug includeExceptionDetailInFaults="true"/>
            </behavior>
        </serviceBehaviors>
        <endpointBehaviors>
            **<behavior name="CorrectEndPoint">
                <wsdlExtensions location="https://www.mydomain.com/WebServices/mydomainws.svc" singleFile="true"/>
            </behavior>**
        </endpointBehaviors>
    </behaviors>

    <serviceHostingEnvironment multipleSiteBindingsEnabled="true" />

    <extensions>
        <behaviorExtensions>
            <add name="wsdlExtensions" type="WCFExtras.Wsdl.WsdlExtensionsConfig, WCFExtras, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/>
        </behaviorExtensions>
    </extensions>

</system.serviceModel>

Кто-нибудь может указать мне правильное направление?
Спасибо, Джордж

1 Ответ

6 голосов
/ 23 октября 2010

Это должно быть обработано новым поведением useRequestHeadersForMetadataAddress . Попробуйте добавить это к своему поведению службы:

  <serviceBehaviors>
    <behavior name="LoadBalancedBehavior">
      <serviceMetadata httpGetEnabled="true" />
      <useRequestHeadersForMetadataAddress>
        <defaultPorts>
          <add scheme="http" port="80" />
          <add scheme="https" port="443" />
        </defaultPorts>
      </useRequestHeadersForMetadataAddress>

      <!-- Other service behaviors as necesary -->

    </behavior>
  </serviceBehaviors>

Это поведение доступно в WCF 4.0 и должно быть доступно в КБ для WCF 3.x.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...