2010-10-22 8 views
8

Ich versuche, einen WCF-Dienst über SSL auf IIS 6 über einen Load Balancer zu starten. Mein anfängliches Problem war offensichtlich und ziemlich gut besprochen - die Adresse, die auf der WSDL-Seite gezeigt wurde, zeigte auf https://SERVERNAME/WebServices/mydomainws.svc anstelle von www.mydomain.com. Die Antwort auf dieses Problem ist das Hinzufügen eines Hostheaderwerts in IIS. Ich habe das getan und es hat ... irgendwie funktioniert. Ich bekomme jetzt http: //www.mydomain.com/WebServices/mydomainws.svc beim Anzeigen der WSDL in einem Browser. Wenn ich auf diesen Link (den Nicht-ssl-Link) klicke, erhalte ich eine Service-Definition, die erneut auf den Servernamen verweist.WCF über IIS durch Load Balancer meldet falsche Basisadresse

Die nächste häufig empfohlene Abhilfe ist die Verwendung WCF Extras, die eine Erweiterung bietet, mit der Sie eine Basisadresse angeben können. Aber das Setzen dieses Konfigurationseintrags hat nur die soap12: -Adresse aktualisiert. Die EndPointReference-Adresse verwendet weiterhin den Computernamen.

Fassen wir zusammen: WSDL als bei https://www.mydomain.com/WebServices/mydomainws.svc in Webbrowser angezeigt: http: //www.mydomain.com/WebServices/mydomainws.scv

den Link oben Ein Klick bringt mich zu einer tatsächlichen WSDL-Datei mit der folgende Service-Eintrag:

https://ServerName/WebServices/mydomainws.svc

Mein Server-Konfigurationsdatei hat die folgenden Servicemodel-Einträge:

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

Kann jemand mich in die richtige Richtung?
Danke, George

+0

Beachtenswert: das Problem ging weg, wenn ich von wsHttpBinding zu basicHttpBinding wechselte. Ich musste dies trotzdem tun, da mein Anrufer auf .net 2.0 ist und einen wsHttpBinding-Dienst nicht nutzen kann. Ich glaube, ich brauche immer noch den Verweis auf die Erweiterung WCF Extras. – GeorgeBarker

Antwort

6

Dies sollte useRequestHeadersForMetadataAddress durch neues Verhalten handeled werden. Versuchen Sie dies zu Ihrem Service Verhalten hinzuzufügen:

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

Dieses Verhalten in WCF 4.0 availabel und sollte als KB für WCF 3.x. verfügbar sein

+4

Ich habe darüber gelesen und es scheint, dass es * sollte * mein Problem zu lösen. Ich verwende WCF 4.0, aber das Hinzufügen des Tags hatte keine Auswirkungen. – GeorgeBarker

+3

@GeorgeBarker: Hast du das jemals gelöst? Ich habe das gleiche Problem. Die WSDL generiert immer Adressen mit HTTP, nicht HTTPS. Ich habe auch versucht, die neue useRequestHeadersForMetadataAddress Verhalten hinzufügen und es machte keinen Unterschied ... – JTech

+0

@JTech: sehr späte Notiz, in erster Linie für den Vorteil von anderen wie uns: Wenn dieses Update scheint nichts zu tun, ist es möglich, dass der Proxy/Load Balancer Überschreibt auch die Anforderungsheader. Sie können den Dienst direkt auf dem IIS-Host testen, indem Sie den Proxy umgehen, um dies zu bestätigen. Für einen Apache-Proxy musste ich der Konfiguration eine ** ProxyPreserveHost ** -Direktive hinzufügen. – Ishmaeel