.net 4 Конечная точка WCF в сгенерированных метаданных (WSDL) указывает на узел, а не на виртуальный хост, размещенный на IL6 с балансировкой нагрузки (NLBS).
Это действительно просто. У меня есть служба wcf (ничего особенного, просто New Project-> WCF Service Application), которая отлично работает в Visual Studio. Когда я развертываю его в кластерной среде IIS6, он работает в основном. Я могу отправить запрос и получить ответ.
Однако сгенерированные метаданные последовательно относятся к конкретному узлу в кластере, а не к виртуальному имени кластера.
https://clustername.test.com/WcfService1/Service1.svc
показывает следующее в 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
который показывает имя узла (node1.test.com), а не имя кластера.
https://clustername.test.com/WcfService1/Service1.svc?wsdl
показывает следующий XML:
...
<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>
Снова, показывая имя узла, а не виртуальный хост.
Так как же выглядит мой web.config? Это маленький, поэтому я покажу все это.
<?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>
1 ответ
Как я знаю, URL в WSDL по умолчанию выводится с хост-сервера. Некоторые KB для.NET 3.5 SP1 представили новое поведение, которое может использовать URL из заголовка узла. Это поведение также было включено в.NET 4.0. Проверьте: useRequestHeadersForMetadataAccess. В конце этой статьи у вас есть описание этого поведения.