2010-03-12 108 views
4

我们有一个WCF服务,它有多个客户端来安排客户端之间的操作。它在XP上效果很好。转到win7,我只能将客户端连接到同一台机器上的服务器。在这一点上,我认为这与IPv6有关,但我很难理解如何继续。WCF上的WCF双工net.tcp问题

客户端试图连接到远程服务器提供了以下异常:

System.ServiceModel.EndpointNotFoundException:无法连接到的net.tcp://10.7.11.14:18297/zetec /服务/ SchedulerService /调度。连接尝试持续时间为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防火墙。我尝试更改本地主机到我的ipv4地址,以尽量远离ipv6,我试图删除任何反ipv6代码。

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

微软的Telnet>打开10.7.11.14 18297
连接为10.7.11.14 ......无法打开连接到主机,端口18297 : 连接失败

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

看起来像连接到本地主机并不总能得到保证。桌面(win7/32)正常工作,笔记本电脑(win7/64)不起作用。其他的win7/64盒子确实可以工作。也许是由于笔记本电脑上的多个网卡?也没有解释测试人员系统连接失败。

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

+0

只是有一点额头拍打的时刻。 IScheduler合同的使用者在机器上工作时没有问题。只有未能连接的IProcessingNodeControl客户端。他们使用几乎相同的代码进行连接。现在我想他们应该有不同的相对网址,但这似乎没有帮助。 – Thomas 2010-03-15 17:12:32

+0

好吧,我可以看到我的客户端失败,失败,无法连接,然后关闭Windows防火墙并成功。我的托管应用程序已经有一个例外,除了我还需要什么? – Thomas 2010-03-15 23:04:38

+1

Net.TCP当然! – Thomas 2010-03-15 23:10:54

回答

2

我没有时间回去测试它是否是从ligos收到的帮助的组合,但主修正似乎是将SMSvcHost.exe添加到Windows防火墙中的例外中。

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

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

  1. 转到服务,找到Net.Tcp端口共享服务,并双击它。滑动路径到可执行文件(不要担心,如果它不是全部在屏幕上,滑动动作应该滚动它)并且复制它(ctrl-c)
  2. 转到您的防火墙并添加一个新的程序以允许通信通过Windows防火墙。粘贴到服务的路径中,然后点击确定。
+0

我的猜测是SMSvsHost.exe是Net.TCP端口共享背后的魔法。很高兴它为你工作。 – ligos 2010-03-16 10:07:52

2

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

我不明白为什么这会与IPv6有关,因为没有错误消息提到IPv6地址。

也许在禁用net.tcp端口共享选项后再试一次。没有端口共享,您应该可以像使用telnet一样使用telnet来连接。

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

对不起,我赶时间,无法查找这些网址。

+0

感谢您的反馈意见,我明天将与地址一起玩。这是用户启动的应用程序中的自托管服务,以管理员身份运行。它住在系统托盘中。 – Thomas 2010-03-15 15:22:39

+0

嗯,你没有具体解决我的问题,但改变到相对路径确实突出了/ Scheduler被用于两个不同的合同,这似乎很奇怪。我改变了第二个到/ NodeControl和它的工作在我的开发设置!不知道为什么它在XP上运行而不是在Win7上运行。谢谢! – Thomas 2010-03-15 19:45:27

+0

那么,部署到测试和事情更糟。如果服务器不在本地主机上,Scheduler客户端和NodeControl客户端都不能连接。 – Thomas 2010-03-15 22:33:37