.net 4 生成的元数据 (WSDL) 中的 WCF 端点指向节点,而不是负载平衡 (NLBS) IIS6 上托管的虚拟主机
这真的很简单。我有一个 wcf 服务(没什么花哨的,只是新项目 -> WCF 服务应用程序),它在 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>
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">
<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>
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
据我所知,WSDL 中的 URL 默认情况下源自托管服务器。 .NET 3.5 SP1 的某些知识库引入了可以使用主机标头中的 URL 的新行为。此行为也包含在 .NET 4.0 中。检查:useRequestHeadersForMetadataAccess。在这篇文章的末尾< /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.