4

我们有一个带有多个客户端的 WCF 服务来安排客户端之间的操作。它在 XP 上运行良好。转到win7,我只能将客户端连接到同一台机器上的服务器。在这一点上,我认为这与 IPv6 有关,但我不知道如何继续。

尝试连接到远程服务器的客户端会出现以下异常:

System.ServiceModel.EndpointNotFoundException:无法连接到 net.tcp://10.7.11.14:18297/zetec/Service/SchedulerService/Scheduler。连接尝试持续了 00:00:21.0042014 的时间跨度。TCP错误码10060:连接尝试失败,因为连接方在一段时间后没有正确响应,或者连接失败,因为连接的主机没有响应10.7.11.14:18297。---> System.Net.Sockets.SocketException: 连接尝试失败,因为连接方在一段时间后没有正确响应,或者建立连接失败,因为连接主机没有响应 10.7.11.14:18297

服务配置如下:

<system.serviceModel>
  <services>
     <service
         name="SchedulerService"
         behaviorConfiguration="SchedulerServiceBehavior">
        <host>
           <baseAddresses>
              <add baseAddress="net.tcp://localhost/zetec/Service/SchedulerService"/>
           </baseAddresses>
        </host>
        <endpoint address="net.tcp://localhost:18297/zetec/Service/SchedulerService/Scheduler"
                  binding="netTcpBinding"
                  bindingConfiguration = "ConfigBindingNetTcp"
                  contract="IScheduler" />
        <endpoint address="net.tcp://localhost:18297/zetec/Service/SchedulerService/Scheduler"
                  binding="netTcpBinding"
                  bindingConfiguration = "ConfigBindingNetTcp"
                  contract="IProcessingNodeControl" />
     </service>
  </services>
  <bindings>
     <netTcpBinding>
        <binding name = "ConfigBindingNetTcp" portSharingEnabled="True">
           <security mode="None"/>
        </binding>
     </netTcpBinding >
  </bindings>

  <behaviors>
     <serviceBehaviors>
        <behavior name="SchedulerServiceBehavior">
           <serviceDebug includeExceptionDetailInFaults="true" />
           <serviceThrottling maxConcurrentSessions="100"/>
        </behavior>
     </serviceBehaviors>
  </behaviors>
</system.serviceModel>

客户端连接如下:

String endPoint = "net.tcp://" + GetIPV4Address(m_SchedulerHostAddress) + ":" + m_SchedulerHostPort.ToString(CultureInfo.InvariantCulture) + "/zetec/Service/SchedulerService/Scheduler";

NetTcpBinding binding = new NetTcpBinding();
binding.Security.Mode = SecurityMode.None;

m_Channel = new DuplexChannelFactory<IProcessingNodeControl>(this, binding, endPoint);
m_IProcessingNodeControl = m_Channel.CreateChannel();

我检查了我的防火墙大约十几次,但我想我可能遗漏了一些东西。试过禁用windows防火墙。我尝试将 localhost 更改为我的 ipv4 地址以尝试远离 ipv6,我尝试删除任何反 ipv6 代码。

不知道这是否意味着什么,但是:

Microsoft Telnet> open 10.7.11.14 18297
Connecting To 10.7.11.14...无法在端口 18297 上打开与主机的连接:连接失败

不幸的是,telnet 测试似乎不是关键。当服务运行时,我已经成功地从本地主机和远程计算机连接到我的服务端口,但是我的客户端无法从远程计算机工作。

似乎并不总是保证连接到本地主机。台式机 (win7/32) 工作,笔记本电脑 (win7/64) 不工作。其他 win7/64 盒子虽然可以工作。也许是由于笔记本电脑上有多个网卡?也没有解释在测试人员的系统上连接失败。

我设置了两台完全禁用 IPv6 的 win7 机器(使用http://support.microsoft.com/kb/929852中的 0xffffffff )。没有帮助。

4

2 回答 2

2

您的主机基地址和端点地址看起来不正确。一个有明确的端口引用,另一个没有。通常,当您使用基地址时,您会在端点地址中使用相对 URL。

我想不出为什么这与 IPv6 有关,因为没有任何错误消息提到 IPv6 地址。

也许在禁用 net.tcp 端口共享选项后重试。如果没有端口共享,您应该能够像以前一样使用 telnet 确认连接。

另外,您的服务是如何在 Win7 中托管的?在 IIS7 中还是在 Windows 服务中自托管?在服务中托管它可能需要授予您的 exe 一些权限,而不是在防火墙上打开端口(就像您有时必须在 Win XP 中以 HTTP 托管 Windows 服务一样)。

抱歉,我很着急,无法查找这些网址。

于 2010-03-13T21:42:15.467 回答
2

我没有时间回去测试它是否是我从 ligos 获得的帮助的组合,但主要修复似乎是将 SMSvcHost.exe 添加到 Windows 防火墙中的异常。

非常感谢你的帮助,ligos。在你回答我的问题之前,我已经准备好放弃了。

将 net.tcp 添加到 windows 防火墙的说明:

  1. 转到服务,找到 net.TCP 端口共享服务,然后双击它。滑动可执行文件的路径(如果它不是全部在屏幕上,请不要担心,滑动动作应该滚动它)并复制它(ctrl-c)
  2. 转到您的防火墙并添加一个允许通过 Windows 防火墙进行通信的新程序。粘贴服务中的路径并点击确定。
于 2010-03-15T23:28:04.403 回答