wcf - Linux上的WCF服务无法通过NetTcp与客户机上的客户端通信

  显示原文与译文双语对照的内容
0 0

今晚学校的礼堂有部很好的电影上演,你想去吗?

我在Linux上编写一个演示控制台应用程序,它由mono运行,并运行在 Windows 7上。

Linux Versoin: 在Ubuntu和match框中

单声道版本:2.10.8.1 ( 在Ubuntu上) 和 2.10.6 ( 在匹配框中)

问题:客户端可以通过basicHttpBinding与服务通信,但不能以 netTcpBinding进行通信。

异常信息: 无法连接到 net.tcp://192.168.1.220/. 连接尝试持续为 00: 00: 14: 0408031. 由于连接方在一段时间后没有正确响应或者已经建立连接失败,TCP错误代码 10060失败,或者已经建立连接失败:。

服务代码:


class Program
 {
 static void Main(string[] args)
 { 
 try
 {
 ServiceHost sh = new ServiceHost(typeof(DynIPService.DynIPService));
//sh.AddServiceEndpoint("DynIPServiceContract.IDynIPService", binding,"net.tcp://10.161.66.213:808");
 sh.Open();
 foreach (var ep in sh.Description.Endpoints)
 {
 Console.WriteLine("Address: {0}, ListenUri: {1}, ListenUriMode: {2}", ep.Address, ep.ListenUri, ep.ListenUriMode);
 }
 Console.WriteLine("Service is running"); 
 }
 catch (Exception ex)
 {
 Console.WriteLine("Error:" + ex.Message);
 throw;
 }
 finally
 {
 Console.ReadKey();
 }
 }
}

服务 app.config ( 部分,这里我只列出端点和绑定)


<services>
 <service name="DynIPService.DynIPService" behaviorConfiguration="MyServiceTypeBehaviors"> 
 <endpoint address="net.tcp://127.0.0.1:808" 
 binding="netTcpBinding" bindingConfiguration="TCP_Binding"
 contract="DynIPServiceContract.IDynIPService"/>
 <endpoint address="http://127.0.0.1:123"
 binding="basicHttpBinding" bindingConfiguration="HTTP_Binding"
 contract="DynIPServiceContract.IDynIPService"/>
 </service>
</services>
<bindings>
 <basicHttpBinding>
 <binding name="HTTP_Binding">
 <security mode="None"></security>
 </binding>
 </basicHttpBinding>
 <netTcpBinding>
 <binding name="TCP_Binding">
 <security mode="None"></security>
 </binding>
 </netTcpBinding>
</bindings> 

客户端代码:


class Program
 {
 static void Main(string[] args)
 {
//var ip ="localhost.localdomain";
 var ip ="192.168.1.220";

//Tcp
 Binding tcpBinding = new NetTcpBinding(SecurityMode.None);
 var tcpUri = new Uri(string.Format("net.tcp://{0}:808", ip));

//http
 Binding httpBinding = new BasicHttpBinding(); 
 var httpUri = new Uri(string.Format("http://{0}:123",ip));

 EndpointAddress address = new EndpointAddress(httpUri.ToString());
 IDynIPService proxy = ChannelFactory<IDynIPService>.CreateChannel(httpBinding, address);
 var hostIP = proxy.ReadHostIp();
 Console.WriteLine(hostIP);
 Console.ReadKey();
 }
}

时间: 原作者:

0 0

如果要使用 net.tcp. 远程连接,需要使用主机上公共可以见的主机的IP地址。

我只是在 Windows 和 net.tcp 上测试了这一点,而在使用 127.0.0.1 时,http实际上表现得不同: HTTP总是听到所有接口,不管你在终端上使用哪个IP地址,使用特定IP使on只听到该地址。

但是,你可以使用 net.tcp://localhost:<port>/<path> 使它在所有接口( 这是在 Mono 2.10.10中实现的,参见 Bug #275 。) 上进行侦听。

所以在 app.config 中使用 net-tcp://localhost:808/ 监听所有接口,或者使用 net-tcp://192.168.1.200:808/ ( 或者什么是机器地址的IP ) 显式将它设置为特定的IP地址( 这在网络上是公开的) 。

...