WCF使用计算机名称而不是IP地址,无法解析

bai*_*alk 8 .net wcf hostheaders wcf-binding wcf-endpoint

我有一个在LAN上正常工作的WCF服务,但是当尝试从外部访问它时,服务引用失败.

我的WCF服务托管在使用静态IP无域的win2k3盒子上.

小智 15

这对我有用.在配置文件中

< serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
< / system.serviceModel >
Run Code Online (Sandbox Code Playgroud)

如果它设置为false,我就会得到那个疯狂的计算机替换.

multipleSiteBindingsEnabled="true" 似乎是我必须做的一切,因为它应该工作.


Dan*_*lpe 5

我正在研究一种重用 HTTP 请求中的 Host 标头的方法。在我看来,这应该适用于开发和生产。

事实证明很简单:

<behaviors>
    <serviceBehaviors>
       <behavior name="...">
         ...
         <useRequestHeadersForMetadataAddress />
       </behavior>
    </serviceBehaviors>
</behaviors>
Run Code Online (Sandbox Code Playgroud)

这样,如果客户端可以访问 WSDL 端点,则可以确保可以使用相同的基本 url 访问所有关联的 wsdl/xsd 资源。


bai*_*alk 3

经过一番挖掘后,我找到了这个问题的答案 - 这是我发现的,希望它可以节省其他人的时间和麻烦。

1.) 将 IP 添加到端点地址并添加带有基本 IP 地址的主机名,如下所示:

<endpoint
  address="http://xx.xx.xx.xx/ServiceApp/Service.svc"
  binding="basicHttpBinding" contract="IService">
</endpoint>
<host>
  <baseAddresses>
    <add baseAddress="http://xx.xx.xx.xx/ServiceApp/" />
  </baseAddresses>
</host>
Run Code Online (Sandbox Code Playgroud)

这曾经足以使我的服务引用工作,但迪斯科文件开始返回计算机名称而不是 IP(我认为这是更新到 .NET 4.0 之后)。

2.) 如果您有域名 (www.myDomain.com),请将其添加到 IIS 中的主机标头中。

3.) 将 IP 地址和计算机名称添加到客户端主机文件中(但是,简单的修复并不总是能够让所有客户端将其添加到其主机文件中)

4.)我发现的最佳解决方案是按照此处的“Timetheos”帖子实现ServiceHosts Factory属性:http://social.msdn.microsoft.com/Forums/en-US/wcf/thread/c7fd51a2-773e-41d4 -95a0-244e925597fe

这对我来说效果很好,因为我可以在本地测试开发和调试我的服务库,然后使用服务应用程序将服务部署到我的开发服务器,并且在发布后无需更改任何配置文件。

整个过程完全是一场噩梦,我不希望任何人遇到这种情况,所以如果您处于同样的情况并且需要有关上述几点的更多信息,请与我们联系!