有
上下文 我编写了一个演示控制台应用程序 - 一个在Linux上通过mono运行的WCF服务,以及一个在Windows 7上运行的控制台客户端。
Linux Versoin:Ubuntu和Match-box
单声道版本:2.10.8.1(在Ubuntu上)和2.10.6(在匹配框上)
问题: 客户端可以通过basicHttpBinding 但不是 netTcpBinding与Service进行通信。
例外信息 无法连接到net.tcp://192.168.1.220/。连接尝试持续时间跨度为00:00:14.0408031。 TCP错误代码10060:连接尝试失败,因为连接方在一段时间后没有正确响应,或者建立的连接失败,因为连接的主机无法响应192.168.1.220:808。
服务代码:
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 :(得分:1)
如果要使用net.tcp远程连接到主机,则需要使用在网络上公开显示的主机的IP地址。
我刚刚在Windows上测试了它,net.tcp和http在使用127.0.0.1
时的行为实际上有所不同:而HTTP似乎总是在所有接口上监听,无论您在端点上使用哪个IP地址,使用特定的IP例如127.0.0.1
使NetTCP只听取该特定地址。
但是,您可以使用net.tcp://localhost:<port>/<path>
使其在所有接口上进行侦听(这是在Mono 2.10.10中实现的,请参阅bug #275)。
因此,要么net-tcp://localhost:808/
使用app.config
来监听所有接口,要么使用net-tcp://192.168.1.200:808/
明确地将其设置为特定的IP地址(在网络上公开显示)(或者机器的IP地址是)。