2014-04-11 3 views
5

Modifica/RiepilogoSignalR su Home Network

Dopo un sacco di tentativi ed errori, Paul Kearney - pk mi ha aiutato a portare la risposta, anche se ancora non so il motivo per cui questo accade, almeno So come farlo funzionare.

Sommario rapido: i client possono connettersi alla porta 8080 sul mio laptop quando sono collegato direttamente alla mia rete al lavoro. I client non possono connettersi alla porta 8080 quando sono su una rete domestica. Per risolvere questo problema, ho creato una regola del firewall (sul mio laptop) per consentire il traffico in entrata su 8080. Mi piacerebbe davvero sapere perché questo è il caso. Il servizio Windows Firewall del mio portatile modifica effettivamente le sue impostazioni in base alla rete a cui sono connesso?


Nota: Questo tutte le opere quando sono sulla mia rete al lavoro, ma non funziona sulla mia rete domestica, o di qualcun altro rete domestica. Il computer host (il mio laptop) è lo stesso in entrambe le posizioni.

Ho un'app Web che utilizza SignalR. Tutto funziona quando eseguo l'app Web sullo stesso computer su cui è in esecuzione l'host SignalR. Quando provo a collegarmi da una macchina diversa, ottengo questo errore:

> GET http://10.0.0.13:8080/signalr/hubs net::ERR_CONNECTION_TIMED_OUT. Cannot read property 'client' of undefined. 

Tale errore viene dalla mia pagina index.html:

<script src="http://10.0.0.13:8080/signalr/hubs"></script> 

Dalla ricerca che ho fatto, ho so che non dovrei usare localhost nel mio URL SignalR. Quindi ho usato un asterisco. Questo è a mio self-hosted SignalR app:

class Program 
{ 
    static void Main(string[] args) 
    { 
     string url = "http://*:8080"; 
     using (WebApp.Start(url)) 
     { 
      Console.WriteLine("Server running on {0}", url); 
      Console.ReadLine(); 
     } 
    } 
} 

class Startup 
{ 
    public void Configuration(IAppBuilder app) 
    { 
     app.UseCors(CorsOptions.AllowAll); 
     app.MapSignalR(); 
    } 
} 
public class RaceHub : Hub 
{ 
    public void Send(string name, string message) 
    { 
     Clients.All.addMessage(name, message); 
    } 
} 

E questo è il mio JavaScript per collegare:

var signalRUrl = 'http://10.0.0.13:8080/signalr'; 

    $.connection.hub.url = signalRUrl; 
    var hub = $.connection.raceHub; // proxy reference to hub 

    // Create a function that the hub can call to broadcast messages. 
    hub.client.addMessage = function (name, message) { 
     receiveSignalRMessage(name, message); 
    }; 

    $.connection.hub.start(); // Start the connection. 

Come ho detto, tutto questo funziona a livello locale. Ma non funziona da un'altra macchina. Windows Firewall non è abilitato, quindi non è questo il problema. Qualche idea?

HTTPS non ha funzionato. Funziona quando sono sulla mia rete al lavoro, ma non a casa. La configurazione è la stessa. Deve avere qualcosa a che fare con la mia rete domestica.

Inoltre, questo è ciò che la pagina si presenta come quando funziona correttamente:

enter image description here

E questo è ciò che accade quando non funziona:

enter image description here

+0

non causato dall'API SignalR, non so senza aver visto le informazioni della macchina ma può essere il risultato di versioni IP. puoi provare le versioni IP? – bashkan

+0

Cosa intendi per versioni IP? IPv4 e IPv6? E cosa significa dimostrarli? Solo che sono tutti IPv4 o IPv6? –

+0

In realtà voglio dire che l'errore non è causato da SignalR, molto probabilmente dalla rete. Potrebbe essere provare a segno più invece di asterisco. – bashkan

risposta

3

(L'informativa completa - @BobHorn digitato questa risposta in base alle mie osservazioni)

Ci sono diverse impostazioni del firewall sul computer, a seconda del tipo di rete a cui si è collegati a.

Hai mai notato quando ti connetti a una nuova rete per la prima volta, ti chiede di definirlo come "lavoro, privato, pubblico, casa, ecc"?

Qualsiasi cosa tu scelga per quella rete è appiccicosa e il relativo criterio del firewall viene applicato quando sei su quel tipo di rete.

Per verificare ciò, è possibile disattivare completamente il firewall o assicurarsi che la porta in entrata 8080 sia aperta per tutti i profili firewall, in particolare le reti "home" e/o il profilo del firewall "home".

ahh .. quindi dici che il tuo Windows Firewall è spento. Sei sicuro che non sia OFF solo per il profilo di rete WORK, ma abilitato per il profilo di rete HOME?

Per risolvere questo problema, vorrei mettere wireshark su uno dei computer client che tentano di connettersi alla porta 8080 a casa e vedere come/perché è bloccato o non riesce a connettersi.

Si può anche provare a telnet alla porta 8080 dal computer client a casa (se la funzione Telnet Client è abilitata). Lo saprai subito se la porta è aperta e la connessione ha esito positivo, oppure un grosso grasso negato. Test rapido e semplice. digitare TELNET ServerIPAddress PortNumber da una riga di comando. Se il comando Telnet non viene trovato, è necessario attivare il client Telnet in Funzioni/componenti di Windows.

0

Il vostro uso della rete Sicurezza IP? Potresti provare a utilizzare HTTPS per vedere se questo allevia qualsiasi cosa.

+0

HTTPS non ha funzionato. Funziona quando sono sulla mia rete al lavoro, ma non a casa. La configurazione è la stessa. Deve avere qualcosa a che fare con la mia rete domestica. –

+0

Il componente che il server utilizza per ricevere le richieste è basato su HTTPListener- è possibile controllare l'URL che si sta utilizzando con la documentazione per quella classe: http://msdn.microsoft.com/en-us/library/vstudio/system .net.httplistener –

0

Sembra che la rete di lavoro stia bloccando il tuo IP. Prova a inserire nella whitelist il tuo IP di casa sulla tua rete di lavoro.

+0

Se ciò era vero, i computer client non sarebbero in grado di aprire la pagina Web in primo luogo. –

+0

Sei sicuro che la connessione siganlR sia lo stesso server della pagina web? È possibile che siano diversi. – Matt

0

Credo che il problema qui sia che l'indirizzo IP del laptop cambia da una rete (ad esempio lavoro) a un'altra (ad es.home), ma potresti non aggiornare il valore della variabile signalRUrl nel tuo file javascript di conseguenza, quindi il lato client della tua app è alla ricerca di un hub a un indirizzo IP che non esiste sulla tua rete domestica.

Quando si modificano le reti, è necessario aggiornare il valore di signalRUrl in javascript per riflettere l'indirizzo IP corrente della macchina host.

+0

Sto aggiornando l'indirizzo IP quando cambio rete, quindi non è questo il problema. –