HttpListener 在 Mono 上运行良好吗?

Posted

技术标签:

【中文标题】HttpListener 在 Mono 上运行良好吗?【英文标题】:Does HttpListener work well on Mono? 【发布时间】:2011-02-24 19:43:54 【问题描述】:

我正在寻找在小型 Linux 机器上运行的小型 Web 服务。我更喜欢用 C# 编写代码,所以我希望使用 Mono。

我不希望运行完整的 Web 服务器或 Mono 的 ASP.NET 版本的开销。我正在考虑使用一个线程处理每个客户端连接的单个进程。线程之间而不是数据库之间的共享内存。

我已经阅读了一些关于 Microsoft 的 HttpListener 版本以及它如何与 Http.sys 驱动程序一起工作的内容。唉,Mono 关于这个类的文档只是自动化的类接口,没有讨论它是如何工作的。 (Linux 没有 Http.sys,所以我想它的实现方式大不相同。)

谁能指点我一些讨论这个模块的资源?

非常感谢,比尔,billpg.com

(我的问题的一些背景知识。)

前段时间,我问过this question,有兴趣通过多次来回进行长时间的对话。我已决定设计自己的 ad-hoc 协议,但与我交谈的人确实想要一个 REST 接口,即使以“好的,现在发送你的命令”信号为代价。

所以,我想知道在 Linux/Mono 服务器上运行 ASP.NET,但偶然发现了 HttpListener。这似乎很理想,因为每个“对话”都可以在单独的线程中运行。在循环中调用 HttpListener 的线程可以查找每个传入连接的线程,并将引用传递给该线程。

ASP.NET 驱动服务的替代方法是让 ASPX 代码从数据库中获取状态,并在完成后写回新状态。是的,它会起作用,但开销很大。

【问题讨论】:

我会从这里开始:koders.com/csharp/… @Mauricioscheffer - 您的链接似乎不再有效。 【参考方案1】:

您好, Mono 中的 HttpListener 类可以正常工作。我认为它在 MS 环境和 Linux 环境中的使用之间最显着的区别是,如果没有 root/su/sudo 安全性,就无法绑定端口 80。其他端口没有这个限制。例如,如果您指定前缀:http://localhost:1234/,HttpListener 将按预期工作。但是,如果您添加前缀 http://localhost/,您希望在端口 80 上侦听,它会静默失败。如果您明确尝试绑定到端口 80 (http://localhost:80/),则会引发异常。如果您以超级用户或 root 身份调用应用程序,则可以显式绑定到端口 80 (http://localhost:80/)。 我还没有足够详细地研究 HttpListener 的其余成员,以便对它在 linux 环境中的运行情况做出任何有用的 cmets。但是,如果有兴趣,我会继续发表我的意见。

鸡肉三明治

【讨论】:

您可以sudo setcap 'cap_net_bind_service=+ep' /usr/local/bin/mono-sgen 启用没有超级用户权限的mono-sgen 路径是否适合您。 直到今天它对我来说都可以正常工作:/现在我的连接在 fin_wait2 状态下徘徊,但可能与单声道升级无关【参考方案2】:

我不知道您为什么要深入了解引擎盖。即使在 Microsoft 方面,如果您使用 .NET Framework,有关 http.sys 的文档也可能无法为您提供真正有价值的信息。

要知道某些东西在 Mono 上是否足够好,您总是应该下载其 VMware 或 VPC 映像,并在其上测试您的应用程序。

http://www.go-mono.com/mono-downloads/download.html

虽然 Mono 比几年前成熟得多,但我们不能说它已经通过了 Microsoft.NET 等足够多的实际应用程序的测试。因此,请测试您的应用程序并将您发现的问题提交给 Mono 团队。

根据我的经验,小问题只需几天即可解决,而大问题则需要更长的时间。但是有了可用的 Mono 源代码,您可以自行修复或在大多数情况下找到好的解决方法。

【讨论】:

非常感谢 Lex。我期待微软的库版本打开一个套接字侦听并执行一些头解析。我没想到内核模块会在 ring 0 中运行。如果 Mono 的版本也使用内核模块,它将通知我需要做出的任何工程决策。 Http.sys 首次出现在 Windows Server 2003 中以提高性能并提供新功能。但它不会改变 HttpListener API,对吧? HttpListener 在 http.sys 不存在的 Windows XP 上仍然有效。这也适用于 Mono,其中底层操作系统可能有也可能没有类似 http.sys 的模块。据我所知,在这种情况下,Mono 团队会尝试提供许多后端,其中一个将在运行时根据它检测到的操作系统/模块被拾取。看看这个类似的案例,“FileSystemWatcher 有什么问题?”在mono-project.com/FAQ:_Technical

以上是关于HttpListener 在 Mono 上运行良好吗?的主要内容,如果未能解决你的问题,请参考以下文章

使用 C# HttpListener 处理多个请求

如何在 C# 中的随机端口上创建 HttpListener 类?

替代 HttpListener?

MONO 4.6.2 服务器上的高 CPU 使用率

我可以使用 .NET DLL 来解决 MONO NotImplementedException

无法在简单的 Grapevine 服务器示例中加载类型 HttpListener