开发者

.net 4 WCF Endpoint in generated metadata (WSDL) points to node rather than virtual host hosted on load balanced (NLBS) IIS6

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.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜