2010-10-22 1 views
8

Sto tentando di avviare un servizio WCF su SSL su IIS 6 tramite un servizio di bilanciamento del carico. Il mio problema iniziale era ovvio e abbastanza ben discusso: l'indirizzo mostrato nella pagina WSDL indicava https://SERVERNAME/WebServices/mydomainws.svc invece di www.mydomain.com. La risposta a questo problema è aggiungere un valore di intestazione host in IIS. L'ho fatto e ha funzionato ... un po '. Ora ricevo http: //www.mydomain.com/WebServices/mydomainws.svc durante la visualizzazione di wsdl in un browser. Se clicco su quel collegamento (il collegamento non-ssl) ottengo una definizione di servizio che fa nuovamente riferimento al nome del server.WCF su IIS tramite il bilanciamento del carico segnala l'indirizzo di base errato

Il rimedio consigliato più avanti è quello di utilizzare WCF Extras che fornisce un'estensione che consente di specificare un indirizzo di base. Ma l'impostazione della voce di configurazione ha aggiornato solo il soap12: indirizzo. L'indirizzo EndPointReference sta ancora utilizzando il nome della macchina.

In sintesi: WSDL come visto nel browser Web a https://www.mydomain.com/WebServices/mydomainws.svc: http: //www.mydomain.com/WebServices/mydomainws.scv

Cliccando sul link qui sopra mi porta ad un file WSDL reale con il voce seguente servizio:

https://ServerName/WebServices/mydomainws.svc

mio file di configurazione del server ha le seguenti voci: 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> 

Qualcuno mi può puntare nella giusta direzione?
Grazie, George

+0

Vale la pena notare: il problema è andato via quando sono passato da wsHttpBinding a basicHttpBinding. Dovevo farlo comunque perché il mio chiamante è su .net 2.0 e non può consumare un servizio wsHttpBinding. Credo di avere ancora bisogno del riferimento all'estensione WCF Extras. – GeorgeBarker

risposta

6

Questo dovrebbe essere handeled dal nuovo comportamento useRequestHeadersForMetadataAddress. Cercate di aggiungere questo al vostro comportamento di servizio:

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

Questo comportamento è availabel in WCF 4.0 e dovrebbe essere disponibile come KB per WCF 3.x.

+4

Ho letto su questo e sembra che * dovrebbe * risolvere il mio problema. Sto facendo funzionare WCF 4.0 ma sfortunatamente aggiungere il tag non ha avuto alcun impatto. – GeorgeBarker

+3

@GeorgeBarker: hai mai risolto questo problema? Sto avendo lo stesso problema. Il WSDL genera sempre gli indirizzi con HTTP, non con HTTPS. Ho anche provato ad aggiungere il nuovo comportamento useRequestHeadersForMetadataAddress e non ha fatto alcuna differenza ... – JTech

+0

@JTech: nota molto tardiva, principalmente a beneficio di altri come noi: Se questa correzione sembra non fare nulla, è possibile che il proxy/load balancer sta anche riscrivendo le intestazioni delle richieste. è possibile testare il servizio direttamente sull'host IIS, ignorando il proxy per confermarlo. Per un proxy Apache, ho dovuto aggiungere una direttiva ** ProxyPreserveHost ** alla configurazione. – Ishmaeel