为什么HttpListener会忽略外部请求?

时间:2013-07-23 03:56:08

标签: c# .net tcplistener httplistener

我的计算机位于将端口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,表示由于this question中提到的问题而拒绝访问。然后,当我关闭Visual Studio并以管理员身份重新打开它时,它将正常运行。当我导航到

时,程序将(正确)终止
http://localhost/testpath/

但是,如果我导航到

,我的请求就会超时
http://externalipaddress/testpath/

为什么我对HttpListener的外部请求超时?结果可以使用'externalipaddress'的数字IP地址或域名重现,以及子文件夹,斜杠等的许多排列,以及也用于前缀“http:// *:80 / testpath /”,“http:// externaldomain:80 / testpath /”和“http:// externalipaddress:80 / testpath /”(没有空格;为stackoverflow添加格式化)。

1 个答案:

答案 0 :(得分:7)

事实证明,Windows防火墙正在默默地从localhost外部进入传入端口80请求。当我禁用防火墙时,HttpListener检测到外部请求。当我重新启用防火墙时,HttpListener停止检测外部请求。当我启用名为“BranchCache内容检索(HTTP-In)”的禁用入站规则时,它允许SYSTEM程序(承载执行TCP侦听HttpListener的服务)侦听端口80,HttpListener再次检测到外部请求。

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