2014-04-11 9 views
5

Bearbeiten/ZusammenfassungSignalR auf Home Network

Nach viel Versuch und Irrtum, Paul Kearney - pk half mir zur Antwort führen, obwohl ich noch nicht wissen, warum dies geschieht, zumindest Ich weiß, wie man es zur Arbeit bringt.

Kurzübersicht: Clients können eine Verbindung zu Port 8080 auf meinem Laptop herstellen, wenn ich bei der Arbeit direkt mit meinem Netzwerk verbunden bin. Clients können keine Verbindung zu Port 8080 herstellen, wenn ich mich in einem Heimnetzwerk befinde. Um dies zu beheben, habe ich eine Firewall-Regel (auf meinem Laptop) erstellt, um eingehenden Datenverkehr auf 8080 zu ermöglichen. Ich würde gerne wissen, warum dies der Fall ist. Ändert der Windows-Firewalldienst meines Laptops tatsächlich seine Einstellungen basierend auf dem Netzwerk, mit dem ich verbunden bin?


Hinweis: Das alles funktioniert, wenn ich in meinem Netzwerk bei der Arbeit bin, aber es funktioniert nicht auf meinem Heim-Netzwerk arbeiten, oder Heimnetzwerk jemand anderes. Der Host-Computer (mein Laptop) ist an beiden Standorten gleich.

Ich habe eine Web-App, die SignalR verwendet. Alles funktioniert, wenn ich die Web-App auf dem gleichen Rechner wie der SignalR-Host laufe. Wenn ich versuche, von einer anderen Maschine zu verbinden, bekomme ich diesen Fehler:

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

Dieser Fehler kommt von meiner Seite index.html:

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

Von der Forschung, die ich getan habe, habe ich wissen, dass ich nicht localhost in meiner SignalR URL verwenden sollte. Also habe ich ein Sternchen benutzt. Das ist in meiner selbst gehosteten 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); 
    } 
} 

Und das ist mein JavaScript zu verbinden:

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. 

Wie ich schon sagte, das alles funktioniert lokal. Aber es funktioniert nicht von einer anderen Maschine. Ich habe die Windows-Firewall nicht aktiviert, das ist also nicht das Problem. Irgendwelche Ideen?

HTTPS hat nicht funktioniert. Es funktioniert, wenn ich in meinem Netzwerk bei der Arbeit bin, aber nicht zu Hause. Die Konfiguration ist gleich. Muss etwas mit meinem Heimnetzwerk zu tun haben.

Auch ist es das, was die Seite aussieht, wenn es richtig funktioniert:

enter image description here

Und das ist, was passiert, wenn es nicht funktioniert:

enter image description here

+0

nicht von SignalR API verursacht, weiß ich nicht, ohne die Maschineninformationen zu sehen, aber es kann Ergebnis von IP-Versionen sein. Können Sie die IP-Versionen nachweisen? – bashkan

+0

Was meinst du mit IP-Versionen? IPv4 und IPv6? Und was bedeutet es, sie zu beweisen? Nur dass sie alle IPv4 oder IPv6 sind? –

+0

Ich möchte eigentlich sagen, Fehler wird nicht von SignalR verursacht, am wahrscheinlichsten von Network. Möglicherweise versuchen Sie, anstelle des Sternchens ein Pluszeichen zu setzen. – bashkan

Antwort

3

(vollständige Offenlegung - @BobHorn getippt diese Antwort auf meine Kommentare auf Basis)

Es gibt verschiedene Firewall-Einstellungen auf dem Computer, abhängig von der Art des Netzwerks, das Sie angeschlossen sind.

Haben Sie jemals bemerkt, wenn Sie zum ersten Mal eine Verbindung zu einem neuen Netzwerk herstellen, werden Sie aufgefordert, es als "Arbeit, Privat, Öffentlich, Zuhause, usw." zu definieren?

Was immer Sie für dieses Netzwerk auswählen, ist sticky, und die entsprechende Firewall-Richtlinie wird angewendet, wenn Sie sich in diesem Netzwerktyp befinden.

Um dies zu überprüfen, können Sie entweder Ihre Firewall vollständig ausschalten oder sicherstellen, dass der eingehende Port 8080 für alle Firewall-Profile geöffnet ist, insbesondere für "Heim" -Netzwerke und/oder das "Home" -Firewall-Profil.

ahh .. so sagen Sie Ihre Windows-Firewall ist ausgeschaltet. Sind Sie sicher, dass es nicht nur für das WORK-Netzwerkprofil deaktiviert ist, sondern für das HOME-Netzwerkprofil aktiviert ist?

Um dies zu beheben, würde ich wireShark auf einem der Client-Computer versuchen, eine Verbindung zu Port 8080 zu Hause, und sehen, wie/warum es blockiert ist oder keine Verbindung herstellen kann.

Sie können auch versuchen, vom Clientcomputer zu Hause aus Telnet an Port 8080 zu senden (wenn die Telnet-Client-Funktion aktiviert ist). Sie werden sofort wissen, ob der Port offen ist und die Verbindung erfolgreich ist oder ein großer Fettwert abgelehnt wird. Schneller und einfacher Test. Geben Sie TELNET ServerIPAddress PortNumber von einer Befehlszeile ein. Wenn der Telnet-Befehl nicht gefunden wurde, müssen Sie den Telnet-Client in Windows-Funktionen/-Komponenten aktivieren.

0

Gibt es in Ihrem Netzwerk verwenden IP-Sicherheit? Sie könnten versuchen, stattdessen HTTPS zu verwenden, um zu sehen, ob das etwas lindert.

+0

HTTPS hat nicht funktioniert. Es funktioniert, wenn ich in meinem Netzwerk bei der Arbeit bin, aber nicht zu Hause. Die Konfiguration ist gleich. Muss etwas mit meinem Heimnetzwerk zu tun haben. –

+0

Die Komponente, die der Server zum Empfangen von Anforderungen verwendet, basiert auf HTTPListener. Sie können die URL, die Sie verwenden, mit der Dokumentation für diese Klasse überprüfen: http://msdn.microsoft.com/en-us/library/vstudio/system .net.httplistener –

0

Es sieht so aus, als ob Ihr Arbeitsnetzwerk Ihre IP blockiert. Versuchen Sie, Ihre private IP-Adresse in Ihrem geschäftlichen Netzwerk aufzulisten.

+0

Wenn das stimmt, dann könnten die Client-Computer die Webseite überhaupt nicht aufrufen. –

+0

Sind Sie sicher, dass die siganlR-Verbindung der gleiche Server wie die Webseite ist? Es ist möglich, dass sie unterschiedlich sind. – Matt

0

Ich glaube, das Problem hier ist, dass die IP-Adresse Ihres Laptops ändert sich von einem Netzwerk (d. H. Arbeit) zu einem anderen (d. H.Wenn Sie den Wert der Variablen signalRUrl in Ihrer JavaScript-Datei nicht entsprechend aktualisieren, sucht die Clientseite Ihrer App nach einem Hub mit einer IP-Adresse, die in Ihrem Heimnetzwerk nicht vorhanden ist.

Wenn Sie Netzwerke ändern, müssen Sie den Wert von signalRUrl in JavaScript aktualisieren, um die aktuelle IP-Adresse des Host-Rechners widerzuspiegeln.

+0

Ich aktualisiere die IP-Adresse, wenn ich das Netzwerk wechsele, also ist das nicht das Problem. –