我有一个简单的WCF服务。由于各种原因,所有配置都是以编程方式而不是在xml中完成的。服务是自托管的。当我在本地计算机上运行主机和客户端时,它运行良好。当我将主机移动到LAN上的另一台机器时,它也很有用。但是,当我尝试通过外部LAN(即使用我的路由器的WAN地址而不是本地LAN地址)到达任一台机器上的主机时,它不起作用,我得到下面的错误。我将路由器上的端口8100转发到服务主机。我还清除了主机防火墙上的端口,并尝试完全关闭防火墙。两者都没有快乐。
我现在正在使用没有安全性的TCP来保持简单。任何人都可以建议可能导致此行为的原因吗?谢谢。
(注意:我在下面的代码中屏蔽了WAN和LAN地址。)
我的客户端类:
public class TrackingClient : IService
{
protected readonly Binding binding;
protected readonly EndpointAddress endpointAddress;
IService proxy;
public TrackingClient()
{
this.binding = new TCPBinding();
this.endpointAddress = new EndpointAddress("net.tcp://WAN_IP:8100/Tracking");
proxy = ChannelFactory<IService>.CreateChannel(
binding,
endpointAddress);
}
public bool report(Payload payload)
{
return proxy.report(payload);
}
}
我的主持人:
ServiceHost host = new ServiceHost(typeof(Service));
host.AddServiceEndpoint(
typeof(IService),
new TrackingComm.TCPBinding(),
"net.tcp://LAN_IP:8100/Tracking");
host.Open();
Console.WriteLine("=== TRACKING HOST ===");
Console.ReadLine();
host.Close();
我的约束力:
public class TCPBinding : NetTcpBinding
{
public TCPBinding()
{
Security.Mode = SecurityMode.None;
Security.Transport.ClientCredentialType = TcpClientCredentialType.None;
Security.Transport.ProtectionLevel = System.Net.Security.ProtectionLevel.None;
Security.Message.ClientCredentialType = MessageCredentialType.None;
}
}
我在客户端尝试连接时得到的错误:
Could not connect to net.tcp://WAN_IP:8100/. The connection attempt lasted for a time span of 00:00:21.0772055. TCP error code 10060: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond WAN_IP:8100.
[编辑]
经过几天的努力,我终于设法将问题跟踪到路由器的环回问题。虽然我还没弄清楚原因,但是发生的事情是,虽然路由器设置为前端端口,但是当我使用WAN地址时,来自客户端的呼叫不会进入主机。无论是通过路由器阻止“走出去”还是“进入”仍然是一个谜,但是当我在局域网外的另一台计算机上运行客户端时它工作得很好
要添加到配置文件的代理设置如下:
<system.net>
<defaultProxy>
<proxy
usesystemdefault = "false"
proxyaddress="http://address:port"
bypassonlocal="false"
/>
</defaultProxy>
</system.net>
这适用于我的服务:
<system.net>
<defaultProxy>
<proxy autoDetect="True"/>
</defaultProxy>
</system.net>