2010-10-22 12 views
8

Estoy intentando iniciar un servicio WCF sobre SSL en IIS 6 a través de un equilibrador de carga. Mi problema inicial era obvio y bastante discutido: la dirección que se muestra en la página WSDL apuntaba al https://SERVERNAME/WebServices/mydomainws.svc en lugar de a www.midominio.com. La respuesta a este problema es agregar un valor de encabezado de host en IIS. Lo hice y funcionó ... más o menos. Ahora obtengo http: //www.mydomain.com/WebServices/mydomainws.svc al ver el wsdl en un navegador. Si hago clic en ese enlace (el que no es SSL) obtengo una definición de servicio que nuevamente hace referencia al nombre del servidor.WCF sobre IIS a través del equilibrador de carga informa la dirección base incorrecta

El siguiente remedio recomendado es utilizar WCF Extras que proporciona una extensión que le permite especificar una dirección base. Pero al configurar esa entrada de configuración solo se actualizó soap12: address. La dirección EndPointReference sigue usando el nombre de la máquina.

En resumen: WSDL como se ve en el navegador web en https://www.mydomain.com/WebServices/mydomainws.svc: http : //www.mydomain.com/WebServices/mydomainws.scv

Al hacer clic en el enlace anterior me lleva a un archivo WSDL real con el entrada siguiente servicio:

https://ServerName/WebServices/mydomainws.svc

Mi archivo de configuración del servidor tiene las siguientes entradas: 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> 

Puede alguien me punto en la dirección correcta?
Gracias, George

+0

Vale la pena señalar: el problema desapareció cuando cambié de wsHttpBinding a basicHttpBinding. Tuve que hacer esto de todos modos ya que mi interlocutor está en .net 2.0 y no puede consumir un servicio wsHttpBinding. Creo que todavía necesito la referencia a la extensión Extras de WCF. – GeorgeBarker

Respuesta

6

Esto se debe handeled por un nuevo comportamiento useRequestHeadersForMetadataAddress. Trate de añadir esto a su comportamiento en servicio:

<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> 

Este comportamiento es availabel en WCF 4.0 y debería estar disponible como KB para 3.x de WCF

+4

He leído sobre esto y parece que * debería * resolver mi problema. Estoy ejecutando WCF 4.0 pero lamentablemente agregar la etiqueta no tuvo impacto. – GeorgeBarker

+3

@GeorgeBarker: ¿Alguna vez resolvió esto? Tengo el mismo problema. WSDL siempre genera direcciones con HTTP, no con HTTPS. También intenté agregar el nuevo comportamiento useRequestHeadersForMetadataAddress y no importó ... – JTech

+0

@JTech: nota muy tardía, principalmente para beneficio de otros como nosotros: si esta solución parece no hacer nada, es posible que el proxy/balanceador de carga también está reescribiendo los encabezados de solicitud. Puede probar el servicio directamente en el host de IIS, evitando el proxy para confirmarlo. Para un proxy Apache, tuve que agregar una directiva ** ProxyPreserveHost ** a la configuración. – Ishmaeel

Cuestiones relacionadas