在关闭防火墙的同一子网上的两台计算机之间,WCF发现不起作用

Rob*_*bin 6 c# wcf

这个简单的WCF发现示例适用于单个计算机,但是当客户端和服务器在同一子网中没有防火墙的不同计算机上运行时,它不起作用.我错过了什么?

using System;
using System.Linq;
using System.Net;
using System.Net.Sockets;
using System.ServiceModel;
using System.ServiceModel.Discovery;

namespace WCFDiscovery
{
   class Program
   {
      static void Main(string[] args)
      {
         try { if (args.Length > 0) StartClient(); else StartServer(); }
         catch (Exception ex) { Console.WriteLine(ex); }
         finally { Console.WriteLine("press enter to quit..."); Console.ReadLine(); }
      }

      private static void StartServer()
      {
         var ipAddress = Dns.GetHostAddresses(Dns.GetHostName()).First(ip => ip.AddressFamily == AddressFamily.InterNetwork);
         var address = new Uri(string.Format("net.tcp://{0}:3702", ipAddress));
         var host = new ServiceHost(typeof(Service), address);
         host.AddServiceEndpoint(typeof(IService), new NetTcpBinding(), address);
         host.Description.Behaviors.Add(new ServiceDiscoveryBehavior());
         host.AddServiceEndpoint(new UdpDiscoveryEndpoint());
         host.Open();
         Console.WriteLine("Started on {0}", address);
      }

      private static void StartClient()
      {
         var dc = new DiscoveryClient(new UdpDiscoveryEndpoint());
         Console.WriteLine("Searching for service...");
         var findResponse = dc.Find(new FindCriteria(typeof(IService)));
         var response = ChannelFactory<IService>.CreateChannel(new NetTcpBinding(), findResponse.Endpoints[0].Address).Add(1, 2);
         Console.WriteLine("Service response: {0}", response);
      }
   }

   [ServiceContract] interface IService { [OperationContract] int Add(int x, int y); }

   class Service : IService { public int Add(int x, int y) { return x + y; } }
}
Run Code Online (Sandbox Code Playgroud)

Dar*_*rer 2

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

A remote side security requirement was not fulfilled during authentication. Try increasing the ProtectionLevel and/or ImpersonationLevel.
Run Code Online (Sandbox Code Playgroud)

这是由于服务安全性未指定,发现了端点。所以,其他答案中的人是对的 - 这是一个网络问题,无法通过更正代码来解决。我想补充一点,问题的另一个可能来源可能是网络交换机不允许 UDP 广播。