2012-12-27 10 views
6

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; } } 
} 
+0

_ "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

+0

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

+1

Fa alcuna differenza se cambi "localhost" con l'indirizzo IP del tuo server al quale il tuo cliente si collegherà? – sclarson

risposta

2

Ho eseguito il codice su 2 macchine differenti (notebook (Win7) e la torre PC (Win8), .NET FW 4.5, stessa rete WiFi) e ha ricevuto seguente eccezione:

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

Questo è dovuto al fatto che la sicurezza del servizio è sottostimata, l'endpoint è stato trovato. Quindi, i ragazzi in altre risposte hanno ragione: questo è un problema di rete che non può essere risolto correggendo il codice. Vorrei aggiungere che un'altra possibile fonte del problema potrebbe essere l'interruttore di rete che non consente le trasmissioni UDP.

+0

Si scopre che l'interruttore di rete non consentiva le trasmissioni UDP. Grazie per l'aiuto. – Robin

1

Per essere chiari, anche il firewall di Windows è disattivato?

Assicurarsi inoltre di legare il server a un indirizzo che l'altro computer utilizza per comunicare con esso.

Localhost o 127.0.0.1 probabilmente non prenderanno una connessione al proprio IP indirizzabile dall'esterno (all'host), che è quello su cui arriveranno i pacchetti di rilevamento multicast.

MSDN instructions on turning the windows firewall off

+0

Sì, ho disattivato manualmente il firewall su entrambe le macchine nel Pannello di controllo e non funziona. Entrambe le macchine sono Windows 7 con .NET 4.0 – Robin

+0

Ho aggiornato il codice sopra per non il codice "localhost" ma il risultato è stato lo stesso. – Robin

+0

Il router ha un firewall separato che potrebbe bloccare questa porta? Potrebbe voler esaminare il port forwarding se questo è il caso. – vesuvious

Problemi correlati