This is real simple. I have a wcf service (nothing fancy, just New Project-> WCF Service Applic开发者_运维技巧ation), that runs great in Visual Studio. When I deploy it to an clustered IIS6 environment, it works mostly. I can send a request and get a response.
However, the generated metadata consistently refers to a particular node in the cluster and not the clusters virtual name.
https://clustername.test.com/WcfService1/Service1.svc
shows the following in 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
which is showing the node name (node1.test.com) rather than the cluster name.
https://clustername.test.com/WcfService1/Service1.svc?wsdl
shows the following 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>
Again, showing the node name rather than the virtual host.
So what does my web.config look like? It is small so I'll show the whole thing.
<?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>
As I know URL in WSDL is by default derived from hosting server. Some KB for .NET 3.5 SP1 has introduced new behavior which can use URL from host header. This behavior was also included in .NET 4.0. Check: useRequestHeadersForMetadataAccess. At the end of this article you have some description for this behavior.
精彩评论