替代 HttpListener?

Posted

技术标签:

【中文标题】替代 HttpListener?【英文标题】:Alternative to HttpListener? 【发布时间】:2010-09-21 19:05:27 【问题描述】:

我正在开发一个应用程序,到目前为止,它使用 HttpListener 来提供一个小型的独立 http 服务器。但是,我最近发现 HttpListener 需要以管理员身份运行,这并不总是可行的。

最好的选择是什么?我需要 http GET 和 POST,它们都不仅仅是在文件系统上读取/写入文件,它们需要运行自定义的 .Net 代码。

到目前为止,我的研究已经提出了 Cassini,但据我所知,我必须编写一个自定义版本。还有别的事吗?特别是与 HttpListener 具有相同界面但不需要管理员权限的东西会很棒!

【问题讨论】:

HttpListener 不需要以管理员身份运行,如果你先做正确的“netsh http add urlacl ...”的东西 netsh 路由真是个可怕的概念。这确实是一种 Windows 主义。在 .NET 中启动 HTTP 侦听器不应该如此复杂和充满部署问题。 【参考方案1】:

对于 .NET Core 应用程序,存在一个新的(跨平台)HTTP 服务器实现:Kestrel。

【讨论】:

【参考方案2】:

关于声明:

我最近发现 HttpListener 需要以管理员身份运行

这并不完全正确,其他一些答案涉及其中一个原因,但还有另一个原因:

    其他发帖人指出:您可以将权限授予非管理员。很好,但不是很好。 您可以在 localhost 上侦听,甚至可以在端口 80 上进行侦听,而无需成为管理员。注意:我记得只有“localhost”有效,而不是“127.0.0.1”...所以请确保将 localhost 传递给 Prefixes.Add 调用。

我们正在发布一个内部工具,允许开发人员在他们的 PC 上运行基于 HTTP 的应用程序主机,我们起初认为由于管理员(或管理员授予的权限)问题而无法使用 HttpListener,但后来我们发现 localhost 无需管理员即可正常工作。这有点道理:从外部收听是“危险的”,但在本地机器上收听却没有那么危险。

【讨论】:

【参考方案3】:

Nowin 是一个很棒的库,可以集成到Owin 中作为ServerFactory,而不依赖于HttpListener。能够顺利替换Microsoft.Owin.Host.HttpListener lib

【讨论】:

嗨,我卡在同一点上。你能帮我更换 HttpListener 吗?【参考方案4】:

就像 Will Dean 在您的帖子中所说的那样,您可以运行以下 netsh 命令:

netsh http add urlacl url=http://+:8346/ user="NTAuthority\Authenticated Users" sddl="D:(A;;GX;;;AU)"

用您的值替换“http://+:8346/”,这将允许任何经过身份验证的用户在目标端点运行网络服务器。

【讨论】:

这对我不起作用;它会导致系统在给定端口上侦听 HTTP,但拒绝所有 503 Service Unavailable 的连接。 @jimrandomh - 尝试输入您的完整域进行注册。示例:netsh http add urlacl url=http://www.mytestdomain.com:8346/ user="NTAuthority\Authenticated Users" sddl="D:(A;;GX;;;AU)"Also, you can check/modify your url reservations with this tool - http://urlreservation.codeplex.com/ 不要忘记您的防火墙设置。 :) 您的防火墙可能会阻止连接。尝试暂时禁用它,然后再次尝试连接以确保这不是问题。【参考方案5】:

我发现的一个替代方法是 CodePlex 上的C# Webserver。

"... 一个灵活的 http 服务器,可以嵌入到任何 .Net 应用程序中。它采用模块化设计,使用模块添加功能。服务器还支持 REST 和所有 http 动词 ..."

它有一个 HttpListener 类,我认为它类似于 System.Net.HttpListener,但我还没有使用其中任何一个,所以我不能确定。

【讨论】:

我相信它是基于套接字的,不需要管理员权限。 哎呀,Chris Kimpton 的链接指向同一个项目,只是在 CodeProject 而不是 CodePex 上。【参考方案6】:

好的,所以您有一个需要允许入站 http 连接的常规桌面应用程序 - 嗯 - Windows 防火墙不是问题吗?

假设不是,它听起来几乎像一个网络服务——你能走那条路吗——通过它公开 URL 吗?虽然我的 .Net 知识还不够深入,无法知道您是否仍需要运行特定的 http 服务器来响应请求。 Spring.Net 可能值得一看。

【讨论】:

不,它只会接收来自 localhost 的连接 - 该应用程序是同时安装的 Adob​​e AIR 应用程序的代理。 另外,我考虑过 web 服务,但服务器将主要提供二进制文件,这不适合 web 服务。【参考方案7】:

this other question 提供了一个解决方案 - 您可以授予自己以非管理员身份运行 HttpListener 的权限。

您可以从一个整理权限的命令文件启动应用程序,然后运行真正的应用程序。

【讨论】:

这不是一个真正的选择,因为应用程序需要像常规桌面应用程序一样易于安装。 我已经走上了 netsh 路线。我假设我可以将 netsh 命令作为安装程序的一部分运行。许多安装程序请求提升权限,即使应用程序没有。 这是一个有用的答案,但需要这样做的事实是一种讽刺

以上是关于替代 HttpListener?的主要内容,如果未能解决你的问题,请参考以下文章

.Net HttpListener 的多线程

socket-WebSocket-HttpListener-TcpListener服务端客户端的具体使用案例

C# 中 HttpListener 和 Griffin.WebServer 的替代方案

WPF 使用HttpListener搭建本地web服务器

Httplistener 和文件上传

HttpListener Digest Auth 架构