我正在使用HttpListener来允许用户在用户定义的端口上设置代理。当我启动HttpListener时,如果应用程序未在Vista中以管理员权限运行,则会出现异常。
根据我的阅读,this is expected behavior - 需要管理员权限才能开始侦听端口。但是我确信有很多方法可以解决这个问题,因为我运行了大量的程序(如Skype),这些程序可以监听端口而无需升级到管理员。
有没有办法用HttpListener做到这一点?如果没有,我可以在.NET代码中进行其他API调用来设置端口吗?
答案 0 :(得分:66)
虽然您可以使用普通的TCP / IP编写自己的HTTP服务器(它相对简单),但使用HttpListener更容易,它利用了Windows XP SP2中添加的HTTP.SYS功能。
但是,HTTP.SYS添加了URL ACL的概念。这部分是因为HTTP.SYS允许您绑定到端口80上的子命名空间。直接使用TCP / IP可以避免此要求,但意味着您无法绑定到已在使用的端口。
在Windows XP上,您可以使用HttpCfg.exe程序设置URL ACL,授予您的用户帐户绑定到特定URL的权限。它位于Platform SDK示例中。
在Windows Vista上,仍支持HTTPCFG,但该功能已被NETSH吸收:
netsh http show urlacl
...将显示现有URL ACL的列表。 ACL以SDDL表示。
netsh http add urlacl url=http://+:80/MyUri user=DOMAIN\User listen=yes
...将配置MyURI名称空间,以便DOMAIN \ User可以监听请求。
答案 1 :(得分:22)
如果您只需要处理来自您自己的计算机的请求(通常用于测试目的),您可以在前缀中编写 localhost 而不是*。
例如,您可以编写“http:// localhost:9669 /”而不是“http:// *:9669 /”。这适用于HttpListener并且不需要管理权限(至少在Windows 7上)。
答案 2 :(得分:10)
我从来没有使用过HttpListener,但是根据你的描述,它听起来更像是你想要在普通的TCP端口上监听,而不是将你的应用程序嵌入服务器URL命名空间(这就是HttpListener似乎要做的事情)。您应该能够使用常规套接字函数(System.Net.Sockets.TcpListener)来打开和侦听TCP端口,而无需管理员权限。我几乎可以肯定Skype不会使用HttpListener。
答案 3 :(得分:7)
我必须处理类似的事情。我的电脑位于受限制的域中,因此我没有管理员权限。经过一些研究和阅读后,我发现这个线程和netsh提示让我使用临时acl绑定只是为了开发测试。在我的计算机上存在这些规则。
有这个条目:
运行'netsh http show urlacl'(如上所示)
[...]
Reservierte URL : http://+:80/Temporary_Listen_Addresses/
Benutzer: \Jeder
Abhören: Yes
Delegieren: No
SDDL: D:(A;;GX;;;WD)
[...]
所以我可以将HttpListener用作非管理员(Jeder):
[...]
HttpListener l = new HttpListener();
string prefix = "http://+:80/Temporary_Listen_Addresses/";
l.Prefixes.Add(prefix);
l.Start(); // does not throw any "Permission Denied/Access Denied/Zugriff verweigert"
[...]
这可以帮助任何人找到这个帖子。
答案 4 :(得分:2)