5

我的计算机位于将端口 80 转发给它的路由器后面(作为端口 80)。我的问题是 HttpListener 似乎忽略了发往外部 IP 地址的请求。

问题不在于路由器;如果我创建一个空白 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 说 Access is denied because of the questions in 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格式添加)。

4

1 回答 1

8

事实证明,Windows 防火墙正在默默地吞噬来自本地主机外部的传入端口 80 请求。当我禁用防火墙时,HttpListener 检测到外部请求。当我重新启用防火墙时,HttpListener 停止检测外部请求。当我启用名为“BranchCache Content Retrieval (HTTP-In)”的禁用入站规则时,该规则允许 SYSTEM 程序(托管 TCP 侦听 HttpListener 的服务)在端口 80 上侦听,HttpListener 再次检测到外部请求。

要在 Windows 7 上查找入站规则列表,请开始 -> 控制面板 -> 系统和安全 -> Windows 防火墙 -> 高级设置 -> 入站规则。

于 2013-07-24T02:56:40.773 回答