代码之家  ›  专栏  ›  技术社区  ›  Thomas daign

Win7上的wcf duplex net.tcp问题

  •  4
  • Thomas daign  · 技术社区  · 14 年前

    我们有一个具有多个客户机的WCF服务来调度客户机之间的操作。它在XP上工作得很好。转到Win7,我只能将客户机连接到同一台计算机上的服务器。在这一点上,我认为这与ipv6有关,但我对如何继续感到困惑。

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

    System.ServiceModel.EndpointNotFoundException:无法连接到net.tcp://10.7.11.14:18297/zetec/service/scheduler service/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>开放时间:2014年11月10日,18297
    连接到10.7.11.14…无法打开与主机的连接,在端口18297上: 连接失败

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

    看起来连接到本地主机并不总是有保证的。桌面(win7/32)工作,笔记本(win7/64)不工作。不过,其他Win7/64框也可以工作。可能是因为笔记本电脑上有多个网卡?也不能解释在测试人员的系统上连接失败。

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

    2 回复  |  直到 14 年前
        1
  •  2
  •   ligos    14 年前

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

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

    请在禁用net.tcp端口共享选项后重试。如果没有端口共享,您应该能够像以前那样使用telnet配置连接。

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

    抱歉,我赶时间,找不到这些的URL。

        2
  •  2
  •   Thomas daign    14 年前

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

    里格斯,非常感谢你的帮助。我准备放弃,直到你回答我的问题。

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

    1. 转到“服务”,找到net.tcp端口共享服务,然后双击它。将路径滑动到可执行文件(不要担心,如果屏幕上没有全部显示,则滑动操作应将其滚动)并复制(ctrl-c)
    2. 转到防火墙并添加一个允许通过Windows防火墙通信的新程序。从“服务”粘贴到路径中,然后单击“确定”。