views:

127

answers:

1

This is real simple. I have a wcf service (nothing fancy, just New Project-> WCF Service Application), 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"&gt;
            <xsd:import schemaLocation="https://node1.test.com/WcfService1/Service1.svc?xsd=xsd0" namespace="http://tempuri.org/"/&gt;
            <xsd:import schemaLocation="https://node1.test.com/WcfService1/Service1.svc?xsd=xsd1" namespace="http://schemas.microsoft.com/2003/10/Serialization/"/&gt;
            <xsd:import schemaLocation="https://node1.test.com/WcfService1/Service1.svc?xsd=xsd2" namespace="http://schemas.datacontract.org/2004/07/WcfService1"/&gt;
        </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"/&gt;
        </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>
A: 

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.

Ladislav Mrnka
sorry it took so long to get to this, the production change took a bit of time to coordinate. But it appears this solution worked well
guutlee