2010-10-22 2 views
8

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

Следующее рекомендуемое решение состоит в использовании 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> 

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

+0

Стоит отметить: проблема исчезла, когда я переключился с wsHttpBinding на basicHttpBinding. Я должен был сделать это в любом случае, поскольку мой вызывающий абонент включен .net 2.0 и не может использовать службу wsHttpBinding. По-моему, мне все еще нужна ссылка на расширение Extras WCF. – GeorgeBarker

ответ

6

Это должно быть handeled новым поведением 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> 

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

+4

Я читал об этом, и кажется, что он должен * решить мою проблему. Я запускаю WCF 4.0, но, к сожалению, добавление тега не повлияло. – GeorgeBarker

+3

@GeorgeBarker: Вы когда-нибудь это решали? У меня такая же проблема. WSDL всегда генерирует адреса с HTTP, а не HTTPS. Я также попытался добавить новое поведение useRequestHeadersForMetadataAddress, и это не имело никакого значения ... – JTech

+0

@JTech: очень поздняя заметка, прежде всего в интересах других, подобных нам: если это исправление, похоже, ничего не делает, возможно, что балансировщик прокси/нагрузки также переписывает заголовки запросов. вы можете протестировать службу непосредственно на хосте IIS, минуя прокси-сервер, чтобы подтвердить это. Для прокси-сервера Apache мне пришлось добавить директиву ** ProxyPreserveHost ** в конфигурацию. – Ishmaeel

Смежные вопросы