Обнаружение 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, на который будут поступать пакеты обнаружения многоадресной рассылки.