.NET 4 WCF Point de terminaison dans les métadonnées générées (WSDL) Points au nœud plutôt qu'à l'hôte virtuel hébergé sur charge équilibrée (NLBS) IIS6
Question
C'est vraiment simple. J'ai un service WCF (rien d'extraordinaire, juste un nouveau projet-> Application de service WCF), qui fonctionne très bien dans Visual Studio. Lorsque je le déploie dans un environnement IIS6 en cluster, cela fonctionne principalement. Je peux envoyer une demande et obtenir une réponse.
Cependant, les métadonnées générées se réfèrent systématiquement à un nœud particulier dans le cluster et non au nom virtuel des clusters.
https://clustername.test.com/WcfService1/Service1.svc
montre ce qui suit dans HTML:
Service1 Service
You have created a service.
To test this service, you will need to create a client
and use it to call the service. You can do this using
the svcutil.exe tool from the command line with the
following syntax:
svcutil.exe https://node1.test.com/DocrRetention/Service1.svc?wsdl
qui affiche le nom du nœud (node1.test.com) plutôt que le nom du cluster.
https://clustername.test.com/WcfService1/Service1.svc?wsdl
montre le XML suivant:
...
<wsdl:types>
<xsd:schema targetNamespace="http://tempuri.org/Imports">
<xsd:import schemaLocation="https://node1.test.com/WcfService1/Service1.svc?xsd=xsd0" namespace="http://tempuri.org/"/>
<xsd:import schemaLocation="https://node1.test.com/WcfService1/Service1.svc?xsd=xsd1" namespace="http://schemas.microsoft.com/2003/10/Serialization/"/>
<xsd:import schemaLocation="https://node1.test.com/WcfService1/Service1.svc?xsd=xsd2" namespace="http://schemas.datacontract.org/2004/07/WcfService1"/>
</xsd:schema>
</wsdl:types>
...
<wsdl:service name="Service1">
<wsdl:port name="BasicHttpBinding_IService1" binding="tns:BasicHttpBinding_IService1">
<soap:address location="https://node1.test.com/WcfService1/Service1.svc"/>
</wsdl:port>
</wsdl:service>
</wsdl:definitions>
Encore une fois, affichant le nom du nœud plutôt que l'hôte virtuel.
Alors, à quoi ressemble mon web.config? Il est petit donc je vais montrer le tout.
<?xml version="1.0"?>
<configuration>
<system.web>
<customErrors mode="Off"/>
<compilation debug="true" strict="false" explicit="true" targetFramework="4.0" />
</system.web>
<system.serviceModel>
<bindings>
<basicHttpBinding>
<binding>
<security mode="Transport"/>
</binding>
</basicHttpBinding>
</bindings>
<services>
<service name="WcfService1.Service1">
<endpoint binding="basicHttpBinding" contract="WcfService1.IService1"/>
<endpoint address="mex" binding="mexHttpsBinding" contract="IMetadataExchange" />
</service>
</services>
<behaviors>
<serviceBehaviors>
<behavior>
<serviceMetadata httpsGetEnabled="true"/>
<serviceDebug includeExceptionDetailInFaults="true"/>
</behavior>
</serviceBehaviors>
</behaviors>
</system.serviceModel>
</configuration>
La solution
Comme je sais que l'URL dans WSDL est par défaut dérivé du serveur d'hébergement. Certains KB pour .NET 3.5 SP1 ont introduit de nouveaux comportements qui peuvent utiliser l'URL de l'en-tête hôte. Ce comportement a également été inclus dans .NET 4.0. Vérifier: userequesthedersformetadataaccess. À la fin de ça article Vous avez une description de ce comportement.