2013-07-23 22 views
5

Mój komputer znajduje się za routerem, który przesyła do niego port 80 (jako port 80). Mój problem polega na tym, że HttpListener wydaje się ignorować żądania kierowane do zewnętrznego adresu IP.Dlaczego HttpListener ignoruje żądania zewnętrzne?

Problem nie dotyczy routera; Jeśli utworzyć pusty projekt C# konsoli i dodać tylko następujące wiersze kodu:

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

... i uruchom program [Uwaga: Przy pierwszym uruchomieniu tego programu, użytkownik może mieć do umożliwienia zapory wyjątkiem], będzie ona rozwiązana, jeśli poruszać się

http://localhost/testpath/ 

w przeglądarce OR gdybym przejdź do

http://externalipaddress/testpath/ 

w przeglądarce - albo adres pomyślnie próby połączenia z portem 80. Tak, wszystko jest ustawione prawidłowo - to komputer może przyjmować połączeń wewnętrznych i zewnętrznych na porcie 80.

Teraz, gdy tworzę kolejny pusty C# projekt konsoli i dodać tylko następujące wiersze kodu:

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

... po pierwsze, otrzymam wyjątek HttpListenerException z informacją, że dostęp jest zabroniony z powodu problemów wymienionych w this question. Następnie uruchomi się poprawnie po zamknięciu Visual Studio i ponownym otwarciu jako Administrator. Program zakończy (prawidłowo), kiedy należy przejść do

http://localhost/testpath/ 

Jednak moją prośbę po prostu czasy się, czy poruszać się

http://externalipaddress/testpath/ 

Dlaczego mój zewnętrzny prośba o HttpListener time out? Wynik jest odtwarzalny z numerycznym adresem IP lub nazwą domeny dla "externalipaddress", jak również z wieloma permutacjami podfolderów, ukośników itp., A także z przedrostkami "http: // *: 80/testpath /", "http : // externaldomain: 80/testpath/"i" http: // externalipaddress: 80/testpath/"(bez spacji, dodane do formatowania stackoverflow).

+1

Czy zapytałeś swojego dostawcę usług internetowych, czy blokuje połączenia przychodzące na porcie 80? Jest to rzadkie, ale niektóre tak. Spróbuj również rozwiązać swój zewnętrzny adres IP, tak aby wskazywał na "homeusr51363_516.your_isp.com" lub podobny – rath

+0

Jeśli mój usługodawca internetowy zablokował połączenia przychodzące, w jaki sposób sukces pierwszego kodu (który łączy się z portem 80 za pośrednictwem zewnętrznego adresu IP) będzie wyjaśnione? Jak już wspomniano, próbowałem używać liczbowego adresu IP i rozpoznawalnej nazwy domeny w żądaniach przeglądarki. – Ben

Odpowiedz

6

Okazuje się, że zapora systemu Windows po cichu zjadała przychodzące żądania portu 80 spoza hosta lokalnego. Po wyłączeniu zapory HttpListener wykrył zewnętrzne żądania. Po ponownym włączeniu zapory HttpListener przestał wykrywać zewnętrzne żądania. Po włączeniu wyłączonej reguły przychodzącej zatytułowanej "Odczytanie zawartości gałęzi (HTTP-In)", która pozwala programowi SYSTEM (który hostuje usługę, która nasłuchuje TCP dla HttpListener) na nasłuchie na porcie 80, HttpListener ponownie wykrył zewnętrzne żądania.

Aby znaleźć listę reguł przychodzących w systemie Windows 7, Start -> Panel sterowania -> System i zabezpieczenia -> Zapora systemu Windows -> Ustawienia zaawansowane -> Reguły przychodzące.

+2

To poważny problem. Nie chcę dodać wyjątku zapory ogniowej dla portu, którego używam. IMHO to zła praktyka. Czy nadal nie ma na to rozwiązania? – Filimindji

+1

Definiując zaporę ogniową, musi istnieć wyjątek zapory ogniowej dla portu, którego chcesz użyć. Trudność polegała na tym, że HttpListener używa czegoś spoza twojego programu, aby nasłuchiwać na porcie 80, więc wystarczy zezwolenie na wyjątek zapory ogniowej dla twojego programu, aby HttpListener nie mógł nasłuchiwać połączeń. – Ben

+0

Dziękuję Ben, pomógł mi zrozumieć problem. Wygląda na to, że nadal jest to kwestia bezpieczeństwa, ale ponieważ nie ma innego rozwiązania, postąpię zgodnie z twoją radą. – Filimindji

Powiązane problemy