Обнаружение 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; } }
}

2 ответов


Я запустил ваш код на 2 разных машинах (ноутбук (Win7) и tower PC (Win8), .NET FW 4.5, та же сеть WiFi) и получил следующее исключение:

A remote side security requirement was not fulfilled during authentication. Try increasing the ProtectionLevel and/or ImpersonationLevel.

Это связано с тем, что безопасность службы была недооценена, конечная точка была найдена. Итак, ребята в других ответах правы-это сетевая проблема, которую нельзя исправить исправлением кода. Я бы добавил, что другим возможным источником проблемы может быть сетевой коммутатор, не разрешающий UDP-трансляции.


чтобы быть ясным, Брандмауэр windows также выключен?

также убедитесь, что вы связываете свой сервер по адресу, который другой компьютер использует для связи с ним.

Localhost или 127.0.0.1, скорее всего, не подберут подключение к его внешнему(хосту) адресуемому IP, на который будут поступать пакеты обнаружения многоадресной рассылки.

MSDN инструкции по выключению брандмауэра windows