2013-07-23 12 views
5

Mein Computer befindet sich hinter einem Router, der Port 80 an ihn weiterleitet (als Port 80). Mein Problem ist, dass HttpListener anscheinend Anfragen ignoriert, die an die externe IP-Adresse adressiert sind.Warum ignoriert HttpListener externe Anforderungen?

Das Problem ist nicht mit dem Router; wenn ich ein leeres C# Konsole-Projekt erstellen und nur die folgenden Codezeilen hinzu:

System.Net.Sockets.TcpListener s = new System.Net.Sockets.TcpListener(System.Net.IPAddress.Any, 80); 
s.Start(); 
System.Net.Sockets.TcpClient c = s.AcceptTcpClient(); 

... und starten Sie das Programm [Anmerkung: das erste Mal dieses Programm ausgeführt wird, kann der Benutzer muss einer Firewall zulassen Ausnahme], wird es beenden, wenn ich

http://localhost/testpath/ 

in meinem Browser navigieren oder wenn ich zu

http://externalipaddress/testpath/ 

in meinem Browser navigieren - entweder Adresse versucht erfolgreich einen Anschluss 80 Anschluss. Also, alles richtig eingestellt ist - dieser Computer interne und externe Verbindungen auf Port akzeptieren 80.

Nun, wenn ich einen anderen Rohling C# Konsole-Projekt erstellen und fügen Sie nur die folgenden Codezeilen:

System.Net.HttpListener s = new System.Net.HttpListener(); 
s.Prefixes.Add("http://+:80/testpath/"); 
s.Start(); 
System.Net.HttpListenerContext c = s.GetContext(); 

... zuerst bekomme ich eine HttpListenerException, die besagt, dass Access aufgrund der in this question genannten Probleme verweigert wird. Dann wird es ordnungsgemäß ausgeführt, wenn ich Visual Studio schließe und es erneut als Administrator öffne. Das Programm wird (richtig) beenden, wenn ich navigieren zu

http://localhost/testpath/ 

jedoch meine Bitte einfach mal aus, wenn ich

http://externalipaddress/testpath/ 

navigieren Warum meine externe Anfrage Httplistener Zeit aus? Das Ergebnis ist reproduzierbar mit einer numerischen IP-Adresse oder einem Domänennamen für 'externe IP-Adresse' sowie vielen Permutationen von Unterordnern, Schrägstrichen usw. und auch für die Präfixe "http: // *: 80/testpath /", "http : // externaldomain: 80/testpath/"und" http: // externalipadresse: 80/testpath/"(keine Leerzeichen; hinzugefügt für Stackoverflow-Formatierung).

+1

Haben Sie Ihren ISP gefragt, ob er eingehende Verbindungen an Port 80 blockiert? Es ist ungewöhnlich, aber manche tun es. Versuchen Sie auch, Ihre externe IP-Adresse aufzulösen, so dass sie auf 'homeusr51363_516.your_isp.com' oder ähnlich lautet. – rath

+0

Wenn mein ISP eingehende Verbindungen blockiert, wie wäre der Erfolg des ersten Codes (der über die externe IP-Adresse mit Port 80 verbunden ist) erklärt? Wie bereits erwähnt, habe ich versucht, eine numerische IP-Adresse und einen auflösbaren Domainnamen in den Browseranfragen zu verwenden. – Ben

Antwort

6

Es stellt sich heraus, dass die Windows-Firewall stillschweigend die eingehenden 80 Anfragen außerhalb von localhost abfraß. Wenn ich die Firewall deaktiviert habe, hat der HttpListener die externen Anforderungen erkannt. Wenn ich die Firewall erneut aktiviert habe, hat der HttpListener die externen Anforderungen nicht mehr erkannt. Wenn ich die deaktivierte Eingangsregel mit dem Titel "BranchCache Content Retrieval (HTTP-In)" aktiviert habe, die dem SYSTEM-Programm (das den Dienst hostt, der TCP auf den HttpListener wartet) auf Port 80 lauscht, hat der HttpListener die externen Anforderungen erneut erkannt.

Um die Liste Eingehende Regeln unter Windows 7 zu finden, wählen Sie Start -> Systemsteuerung -> System und Sicherheit -> Windows Firewall -> Erweiterte Einstellungen -> Eingehende Regeln.

+2

Dies ist ein großes Problem. Ich möchte eine Firewall-Ausnahme für den von mir verwendeten Port nicht hinzufügen. IMHO ist das eine schlechte Übung. Gibt es dafür noch keine Lösung? – Filimindji

+1

Durch die Definition einer Firewall muss eine Firewall-Ausnahme für den Port vorhanden sein, den Sie verwenden möchten. Die Schwierigkeit dabei war, dass HttpListener etwas außerhalb Ihres Programms verwendet, um auf Port 80 zu hören. Daher ist es einfach nicht erlaubt, eine Firewall-Ausnahme für Ihr Programm zuzulassen, damit HttpListener auf Verbindungen warten kann. – Ben

+0

Danke Ben, du hast mir geholfen, das Problem zu verstehen. Es sieht für mich so aus, dass dies immer noch ein Sicherheitsproblem ist, aber da es keine andere Lösung gibt, werde ich Ihrem Rat folgen. – Filimindji