C# HttpListener在Mono上运行良好吗?

C# HttpListener在Mono上运行良好吗?,c#,mono,httplistener,C#,Mono,Httplistener,我想写一个小的web服务来运行在一个小的Linux机器上。我更喜欢用C语言编写代码,所以我希望使用Mono 我不想要运行完整的web服务器或Mono版本的ASP.NET的开销。我想用一个进程和一个线程来处理每个客户端连接。线程之间共享内存,而不是数据库 我读了一些关于微软版本的HttpListener以及它如何与Http.sys驱动程序一起工作的文章。唉,Mono关于这个类的文档只是一个自动类接口,没有讨论它是如何工作的。(Linux没有Http.sys,所以我认为它的实现方式有很大不同。) 有

我想写一个小的web服务来运行在一个小的Linux机器上。我更喜欢用C语言编写代码,所以我希望使用Mono

我不想要运行完整的web服务器或Mono版本的ASP.NET的开销。我想用一个进程和一个线程来处理每个客户端连接。线程之间共享内存,而不是数据库

我读了一些关于微软版本的HttpListener以及它如何与Http.sys驱动程序一起工作的文章。唉,Mono关于这个类的文档只是一个自动类接口,没有讨论它是如何工作的。(Linux没有Http.sys,所以我认为它的实现方式有很大不同。)

有人能告诉我一些讨论这个模块的资源吗

非常感谢,比尔,billpg.com

(为感兴趣的人提供我问题的一点背景。)

前段时间,我问,我有兴趣保持一个长时间的谈话,有很多来回。我已经决定设计自己的特别协议,但与我交谈的人确实想要一个REST接口,即使是以“好的,现在就发送命令”信号为代价

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


对于ASP.NET驱动的服务,另一种选择是让ASPX代码从数据库中获取状态,并在完成后写回新状态。是的,它会起作用,但那是一个很大的开销。

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

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

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

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

, Mono中的HttpListener类可以正常工作。我认为,在MS环境和Linux环境中使用它的最大区别在于,如果没有root/su/sudo安全性,端口80无法绑定到。其他端口没有此限制。例如,如果指定前缀:
http://localhost:1234/
HttpListener按预期工作。但是,如果添加前缀
http://localhost/
,您希望在端口80上侦听,但它会以静默方式失败。如果显式尝试绑定到端口80(),则会引发异常。如果以超级用户或根用户身份调用应用程序,则可以显式绑定到端口80()。
我还没有对HttpListener的其他成员进行足够详细的探讨,没有对它在linux环境中的运行情况发表任何有用的评论。不过,如果有人感兴趣,我将继续发表我的意见


chickenSandwich

我从这里开始:@MauricioScheffer-你的链接似乎不再有效了。非常感谢Lex。我希望Microsoft版本的库能够打开套接字侦听并执行一些头解析。我不希望内核模块在环0中运行。如果Mono的版本也使用内核模块,它将通知我需要做出的任何工程决策。Http.sys首先出现在Windows Server 2003中,以提高性能并提供新功能。但它不会改变HttpListenerAPI,对吗?HttpListener仍然在不存在http.sys的Windows XP上工作。这也适用于Mono,在Mono中,底层操作系统可能有也可能没有类似http.sys的模块。据我所知,在这种情况下,Mono团队试图提供许多后端,其中一个将在运行时根据它检测到的操作系统/模块进行选择。查看类似的案例“FileSystemWatcher有什么问题?”在中,您可以
sudo setcap'cap\u net\u bind\u service=+ep'/usr/local/bin/mono sgen
启用<1024个端口,而无需超级用户权限。在运行该命令之前,请确保检查
mono sgen
path是否适合您。直到今天,它对我来说还可以:/n现在我的连接仍处于fin_wait2状态,但可能与mono升级无关