使用HttpListener作为生产级别的Web服务器?

10

使用C# .Net类HttpListener作为生产级Web服务器的基础是否现实?

我需要托管的http Web服务不包含.aspx或静态文件。所有http响应都是动态生成的,并且由几个switch语句调用c#代码,这些语句检查restful url格式。

我的想法是,IIS实际上是Windows操作系统HTTP-SYS内核模块的用户模式包装器,它处理所有重量级的网络处理工作,HttpListener也是一样。

我已经运行了一个基本的多线程Web服务器,非常适合开发,因为它在一个实例中以调试模式启动,现在我在考虑,是否需要在生产环境中使用IIS过于复杂。低内存占用也是一个吸引点。


2
顺便提一下,它是 .NET 类 HttpListener,而不是 "C# .NET 类 HttpListener"。在 .NET 中的所有内容都可以被任何语言使用,而不仅仅是 C#。 - John Saunders
1
@John Saunders - 我试图表明我的问题与同名的Java类无关,显然我尝试过度了。 - camelCase
1
我不会使用HttpListener,因为它不是httpapi.dll的最佳包装器,你可以编写自己的包装器,或者如果你真的很疯狂,你可以从TcpListener构建一个...已经有人在这方面工作:http://webserver.codeplex.com - meandmycode
4个回答

7
你有两个严肃的选择。不,使用HttpListener编写自己的Web服务器并不是产品级别的。
1)使用IIS。它拥有大量用于安全性、性能和可能更重要的可管理性的功能,这些都需要你自己重新发明,例如远程管理、日志记录、集成的Windows安全等。
2)使用WCF并创建ServiceHost来托管你的文件。然后,你将不得不实现自己的服务并找到一种管理它们生命周期的方法。你可以做到这一点,但是如果你谈论RESTFul web调用,IIS确实是最佳选择。
应该避免手动编写自己的服务器。在过去的10年中,IIS已经发生了很大改变。它绝不再是一个庞大的单体服务器。他们已经将几乎所有内容模块化了,特别是在Windows 2008中,因此你可以获得一个精简快速的系统。

@Dave Markle - 谢谢,我需要阅读有关IIS改进的资料,我的知识停留在Windows 2003。我需要的是轻巧快速的东西。 - camelCase
7
@Dave Markle - 没有远程管理=很好,少一个配置安全漏洞。没有日志记录=没有问题,使用动态Web服务时,大部分请求的特性都包含在POST数据中,因此日志对于诊断不会暴露太多信息。没有集成安全性=很好,不需要它,所以少了一个容易被误配置的事情。 - camelCase
1
你是按照Windows Server 2003的标准来评判的。2008-2003=5年的差距。日志记录要好得多,不仅限于IIS日志中的单行记录,还包括详细的失败请求日志记录。 - John Saunders

6

好的,正如所说 - 首先尝试使用IIS。

HttpListener也不错 - 这是目前最快的托管侦听器服务器(比TcpListener和Socket类更快)。它实际上与IIS具有相同的核心。但是IIS还有很多其他东西。

我不能说IIS是单体 - 托管使用表明,在稳定性和管理方面,它在Win2008中变得更糟。但是你自己制作的解决方案可能会更糟。而且不要忘记 - http.sys比HttpListener更可定制。也就是说,您无法使用HttpListener进行流式传输,但是您可以使用http.sys进行流式传输 - 关于HttpListener流式传输的问题

但是,如果您作为开发人员拥有足够的能力,则可以尝试编写自己的http.sys包装器,这是在Windows中编写自己的Web服务器的最佳方法。


你有一个详细说明Win2008稳定性和管理下降的URL吗? - Dan

4
垃圾,自己动手。这种架构允许这样做。但要注意类中可能会出现一些奇怪的行为。在NT服务中多次关闭它会使其像泡芙饼干一样不稳定。
如果在控制台上运行,则完全没有问题。异步运行也应该没问题,但是启动和停止该程序是一个不同的问题,我目前正在努力解决,因为密封的Microsoft类没有产生任何错误。
我觉得Python会有所帮助,再加上一点CherryPy。

2

如果你写了它,那么就要维护它。微软已经编写了一个Web服务器-您应该使用它。


1
内存消耗是不使用IIS的一个很好的理由。上次我在生产环境中使用它时,我们不得不启用3GB开关,以便给予IIS超过1.7GB的更大内存空间。如果计算一下在云平台上进行托管的费用,你就会看到$$$问题所在。 - camelCase
我强烈建议您尝试使用IIS 7,并查看是否仍然存在此问题。这也可能是由于特定应用程序而不是IIS引起的。 - John Saunders
1
@JS "我强烈建议您尝试使用IIS 7,看看这个问题是否仍然存在。"好的,我会这样做的,我现在正在使用BizSpark,所以我可以启动一些MS测试工具进行内存浸泡测试。有一个小问题,亚马逊云平台目前还停留在Windows 2003上...嗯。 - camelCase

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接