Questo semplice esempio di rilevamento WCF funziona su una singola macchina ma quando il client e il server sono in esecuzione su macchine separate nella stessa subnet senza firewall, non funziona Cosa mi manca?Il rilevamento WCF non funziona tra due computer nella stessa subnet con il firewall disattivato
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; } }
}
_ "quando il client e il server sono in esecuzione su macchine separate" _ - si usa un indirizzo diverso? Inoltre: _ "non funziona" _ non è un'eccezione. Mostra il messaggio esatto. – CodeCaster
Il server è in ascolto sulla porta 8000. Per "non funziona" intendo che "dc.Find (...)" restituisce zero endpoint, quindi questo codice "Endpoint [0]" genera un'eccezione ArgumentOutOfRangeException – Robin
Fa alcuna differenza se cambi "localhost" con l'indirizzo IP del tuo server al quale il tuo cliente si collegherà? – sclarson