C# WCF发现没有';在防火墙关闭的情况下,同一子网上的两台计算机之间无法工作

C# WCF发现没有';在防火墙关闭的情况下,同一子网上的两台计算机之间无法工作,c#,wcf,C#,Wcf,这个简单的WCF发现示例可以在一台机器上运行,但当客户端和服务器在同一子网中的不同机器上运行且没有防火墙时,它就不起作用了。我错过了什么 使用系统; 使用System.Linq; Net系统; 使用System.Net.Sockets; 使用System.ServiceModel; 使用System.ServiceModel.Discovery; 命名空间WCFDiscovery { 班级计划 { 静态void Main(字符串[]参数) { 请尝试{if(args.Length>0)Start

这个简单的WCF发现示例可以在一台机器上运行,但当客户端和服务器在同一子网中的不同机器上运行且没有防火墙时,它就不起作用了。我错过了什么

使用系统;
使用System.Linq;
Net系统;
使用System.Net.Sockets;
使用System.ServiceModel;
使用System.ServiceModel.Discovery;
命名空间WCFDiscovery
{
班级计划
{
静态void Main(字符串[]参数)
{
请尝试{if(args.Length>0)StartClient();else StartServer();}
catch(异常ex){Console.WriteLine(ex);}
最后{Console.WriteLine(“按enter键退出…”);Console.ReadLine();}
}
私有静态void StartServer()
{
var ipAddress=Dns.GetHostAddresses(Dns.GetHostName())。首先(ip=>ip.AddressFamily==AddressFamily.InterNetwork);
var address=newURI(string.Format(“net.tcp://{0}:3702”,ipAddress));
var host=新的ServiceHost(类型(服务),地址);
AddServiceEndpoint(typeof(IService),新的NetTcpBinding(),地址);
host.Description.Behaviors.Add(新服务发现行为());
AddServiceEndpoint(新的UdpDiscoveryEndpoint());
host.Open();
WriteLine(“在{0}上启动”,地址);
}
私有静态void StartClient()
{
var dc=new DiscoveryClient(new UdpDiscoveryEndpoint());
控制台.WriteLine(“搜索服务…”);
var findResponse=dc.Find(新的FindCriteria(typeof(IService));
var response=ChannelFactory.CreateChannel(新的NetTcpBinding(),findResponse.Endpoints[0].Address).Add(1,2);
WriteLine(“服务响应:{0}”,响应);
}
}
[ServiceContract]接口IService{[OperationContract]int Add(int x,int y);}
类服务:IService{public int Add(int x,int y){return x+y;}
}

需要澄清的是,windows防火墙是否也已关闭

还要确保将服务器绑定到另一台计算机用来与其通信的地址

Localhost或127.0.0.1可能无法连接到其外部(到主机)可寻址IP,这是多播发现数据包将到达的IP


我在两台不同的机器上运行了您的代码(笔记本电脑(Win7)和塔式电脑(Win8),.NET FW 4.5,相同的WiFi网络),并收到以下异常:

A remote side security requirement was not fulfilled during authentication. Try increasing the ProtectionLevel and/or ImpersonationLevel.
这是由于服务安全性未指定,因此找到了端点。所以,其他答案中的人是对的——这是一个网络问题,不能通过纠错码来解决。
我想补充一点,问题的另一个可能来源可能是网络交换机不允许UDP广播。

“当客户端和服务器在不同的机器上运行时”-您是否使用不同的地址?此外,“它不工作”也不例外。显示确切的消息。服务器侦听端口8000。“不工作”是指“dc.Find(…)”返回零个端点,因此此代码“endpoints[0]”抛出ArgumentOutOfRangeException如果将“localhost”更改为客户端将连接到的服务器的IP地址,会有什么不同吗?我将上面的代码更新为非硬代码“localhost”但是结果是一样的。你能从一台机器到另一台机器执行telnet测试吗?例如,当您尝试
telnet 3702
时会发生什么情况?您应该会得到一个空白窗口,指示端口已打开。(或尝试…如果无法访问端口,请发送消息)此外,我非常确定使用localhost不是您的问题(如您所想)-现在您在评论中提到端口8000,但在代码中使用端口3702?是的,我在控制面板中手动关闭了两台机器上的防火墙,但它不起作用。这两台机器都是Windows 7,带有.NET 4.0I。将上述代码更新为非硬代码“localhost”,但结果相同。您的路由器是否有单独的防火墙,可能会阻止此端口?如果是这种情况,可能需要研究端口转发。我已确认端口已使用telnet打开,因此我不认为防火墙是问题所在。结果表明网络交换机不允许UDP广播。谢谢你的帮助。