【问题标题】:WCF is using the computer name instead of the IP address and cannot be resolvedWCF 使用计算机名称而不是 IP 地址,无法解析
【发布时间】:2011-10-15 08:41:14
【问题描述】:

我的 WCF 服务在 LAN 上运行良好,但尝试从服务引用外部访问它时失败。

我的 WCF 服务托管在使用静态 IP 无域的 win2k3 机器上。

【问题讨论】:

  • 如果它在本地工作并且 wsdl 显示在端口 80 网页上,是否您的服务正在使用其他端口并且路由器防火墙阻止了对这些端口的外部访问?
  • 防火墙没问题,局域网外无法解析计算机名,但我现在有解决办法。无论如何,谢谢。

标签: .net wcf wcf-binding wcf-endpoint hostheaders


【解决方案1】:

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

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>

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

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

3.) 将 IP 地址和计算机名称添加到客户端主机文件中(但是,简单的解决方法并不总是可以让所有客户端都将其添加到他们的主机文件中)

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

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

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

【讨论】:

  • 嗨 baileyswalk,当我将其更改为 ip 地址时,它会询问我用户名和密码,当我提供它不连接时
【解决方案2】:

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

< serviceHostingEnvironment multipleSiteBindingsEnabled="true" />
< / system.serviceModel >

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

multipleSiteBindingsEnabled="true" 似乎是我必须做的所有事情才能让它正常工作。

【讨论】:

  • 谢谢,这是解决这个问题的合适方法
【解决方案3】:

像这样设置服务端点和httpgeturl。

<services>
    <service behaviorConfiguration="serviceBehaviour" name="Demo.Service.MultiEndPointsService">
        <endpoint address="http://192.168.1.2/Demo.Service/MultiEndPointsService.svc/basic" binding="basicHttpBinding" bindingConfiguration="basicBinding"      contract="Demo.Service.MultiEndPointsService" />
    </service>
</services>
<behaviors>
    <serviceBehaviors>
        <behavior name="serviceBehaviour">
            <serviceMetadata httpGetEnabled="true" httpGetUrl="http://192.168.1.2/Demo.Service/MultiEndPointsService.svc/basic"/>     
            <serviceDebug includeExceptionDetailInFaults="false" />
        </behavior>
    </serviceBehaviors>
</behaviors>

【讨论】:

    【解决方案4】:

    我正在寻找一种方法来重用 HTTP 请求中的 Host 标头。在我看来,这应该在开发中像在生产中一样工作。

    事实证明很简单:

    <behaviors>
        <serviceBehaviors>
           <behavior name="...">
             ...
             <useRequestHeadersForMetadataAddress />
           </behavior>
        </serviceBehaviors>
    </behaviors>
    

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

    【讨论】:

      【解决方案5】:

      您可以使用星号 *(通配符)代替基本 url 中的 LocalHost 或机器名称,如下所示:

      <add baseAddress="net.tcp://*:4502/WxWcfService_01" />
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-02-05
        • 1970-01-01
        • 2013-01-29
        • 1970-01-01
        • 2011-06-14
        • 2013-02-07
        • 2013-11-11
        • 1970-01-01
        相关资源
        最近更新 更多