2013-07-23 61 views
5

我的電腦位於一個路由器後面,它將端口80轉發給它(作爲端口80)。我的問題是,HttpListener似乎忽略了尋址到外部IP地址的請求。爲什麼HttpListener會忽略外部請求?

問題不在於路由器;如果我創建了一個空白的C#控制檯項目和只添加以下代碼行:

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

...並運行該程序[注:第一次此程序運行時,用戶可能必須允許防火牆例外],它會如果我在我的瀏覽器瀏覽到

http://localhost/testpath/ 

終止或者如果我在我的瀏覽器瀏覽到

http://externalipaddress/testpath/ 

- 任一地址成功嘗試端口80連接。所以,一切都設置正確 - 這臺計算機可以接受端口內部和外部連接現在80

,如果我創建另一個空白的C#控制檯項目和只添加以下代碼行:

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

...首先,我將得到一個HttpListenerException,說因爲this question中提到的問題,訪問被拒絕。然後,當我關閉Visual Studio並以管理員身份重新打開它時,它將正常運行。該計劃將終止(正常),當我瀏覽到

http://localhost/testpath/ 

然而,我的要求只是超時,如果我瀏覽到

http://externalipaddress/testpath/ 

爲什麼我的外部請求HttpListener超時?結果可以通過數字IP地址或「externalipaddress」的域名以及子文件夾,斜槓等的多種排列以及前綴「http:// *:80/testpath /」,「http :// externaldomain:80/testpath /「和」http:// externalipaddress:80/testpath /「(無空格;爲stackoverflow格式添加)。

+1

您是否問過您的ISP是否阻止端口80上的傳入連接?這是不尋常的,但有一些。也嘗試解析您的外部IP,以便它指向'homeusr51363_516.your_isp.com'或類似的 – rath

+0

如果我的ISP阻止傳入連接,第一個代碼(通過外部IP地址連接到端口80)的成功將如何解釋呢?如上所述,我已經嘗試在瀏覽器請求中使用數字IP地址和可解析的域名。 – Ben

回答

6

事實證明,Windows防火牆默默地從本地主機外部進入端口80請求。當我禁用防火牆時,HttpListener檢測到外部請求。當我重新啓用防火牆時,HttpListener停止檢測外部請求。當我啓用允許SYSTEM程序(承載TCP偵聽HttpListener的服務)在端口80上偵聽的名爲「BranchCache Content Retrieval(HTTP-In)」的禁用入站規則時,HttpListener再次檢測到外部請求。

要在Windows 7上查找入站規則列表,請從開始 - >控制面板 - >系統和安全 - > Windows防火牆 - >高級設置 - >入站規則。

+2

這是一個大問題。我不願意爲我正在使用的端口添加防火牆例外。恕我直言,這是一個不好的做法。那還有沒有解決辦法? – Filimindji

+1

通過定義防火牆,您要使用的端口必須有防火牆例外。這裏的困難是HttpListener使用程序外部的某些東西來偵聽端口80,所以僅僅允許程序的防火牆異常不足以讓HttpListener偵聽連接。 – Ben

+0

謝謝你本,你幫我理解了這個問題。在我看來,這仍然是一個安全問題,但由於沒有其他解決方案,我會按照您的建議。 – Filimindji