我通常使用 Linux 服务器来运行我的应用程序。因此,我对 Windows 服务器的防火墙系统还很陌生。
我有一个 C# 应用程序需要充当 HTTP 服务器。有多种方法可以通过不同的抽象级别实现这一点:当然,有一个Socket
库可以提供非常基本的功能。对于 TCP 流量,还有一个TcpClient
。两者都在特定端口上侦听,并且需要在 Windows 防火墙中定义“入站规则”才能从另一台计算机访问(当您只需要从您的计算机访问它时,不需要规则)。
然后是HttpListener
。它不基于每个端口运行,而是使用 URI 前缀来匹配请求。例如,前缀“http://*:80/”将处理所有端口 80 的 http 流量。
真正让我感到困扰的是,要使HttpListener
Windows 防火墙正常工作,不需要在 urlacl 中设置任何规则,但需要:
netsh http add urlacl url=http://*:80/ user=DOMAIN\user
(这是 url 命名空间的保留)
实现 http 服务器的这三种方法都同样有用。不同之处在于使用 HttpListener 时需要的代码少得多。
我的问题是:为什么有 URL 命名空间预留的概念,但未注册的 URL 仍然可以被服务器监听。为什么已注册的 URL 可以绕过防火墙规则?为什么首先会有这样的系统?
答案1
据我所知,net http 显示/编辑 http.sys 的配置,IIS 的内核模式驱动程序部分,它与 Windows 激活服务器 (WAS) 一起也可以由非 IIS 应用程序使用。它们只需注册其 URL,以便 http.sys/WAS 可以将请求路由到正确的客户端并避免冲突。
如果您选择自己实现低级端口监听,则不会使用 http.sys 并且不必使用 netsh 注册 url,但您仍然需要注意不要与其他程序发生任何冲突。
.NEThttpListener
类也使用 http.sys
至于防火墙规则,我认为已注册的 URL 不需要防火墙规则。您的示例http://*:80/
已包含在World Wide Web Services
文件墙规则中。