IIS7模块 - 管理型还是本地型?

3


由于旧的ISAPI筛选器迟早会被淘汰,我想将用于IIS 6的旧ISAPI筛选器重写为一个IIS 7模块。该模块将被全局使用,意味着它将在安装有IIS 7.5的Windows Server 2008 R2中的每个站点中使用,其中将托管数千个Web站点并管理约50个应用程序池。
我的问题是我应该使用托管代码还是非托管代码来编写该模块?关于托管代码的一个问题是由于.NET框架开销而导致的大量内存消耗。我不知道这会如何影响服务器性能。
我已经编写了托管和非托管代码的模块。所以这不是我的决定困扰之处。但是如果没有巨大的缺点,我更喜欢用C#编写模块。
对于这个问题,您有什么建议吗?

2个回答

5
Rick Strahl 提供了有用的建议,我在learn.iis.net上看到了多篇文章也表达了相同的观点。
重要的是要理解使用这种强大功能时可能会出现错误的潜力。首先要记住,在Web服务器中,托管代码比本机代码慢。通过将托管代码引入核心服务器,您会减慢Web服务器的性能。特别是,在集成模式下运行且存在托管模块时,托管和非托管代码之间的上下文切换是昂贵的。我与一些Microsoft开发人员交谈过,他们正在努力优化这些上下文切换,尽可能批量调用托管代码组件,并尽可能长时间地保持在托管代码中。
默认情况下,托管代码是可选的-所有核心模块都是本机代码,因此添加托管模块是您必须做出的明确决定。如果您已经在使用ASP.NET,则这个决定可能是一个不言而喻的选择。但是,如果您今天正在运行原始的ISAPI扩展或模块,则可能需要仔细考虑托管代码是否适合于性能方面。
简而言之,如果所有应用程序都是ASP.NET,则编写IIS托管模块时几乎没有任何开销-这是一个简单的选择。
然而,如果网站本来不会加载CLR,那么为了执行您的模块而这样做将是昂贵的,您需要仔细考虑(测量!)影响,以确定性能损失是否值得开发时间的生产力收益。

1

这要看情况。

如果你能够管理好所有的应用程序,那就使用Go语言进行管理。这样可以实现纯粹的托管堆栈。我会推荐这种方式;)

至于内存 - 别管它。说真的。IIS 7核心是托管的,只有在需要时才会连接旧的堆栈。所以,无论你喜不喜欢,你已经有了.NET。此外,现代服务器有相当多的内存 - 即使池运行在32位(强烈建议),仍然有50个池;)而不是64MB RAM的服务器;)


抱歉,但此語句完全不正確:“IIS 7 核心是可管理的,只要需要就可以連接到傳統堆棧。”相反的是 - IIS 7 核心是本地的,並根據需要引入CLR。變化的是它現在直接將托管代碼集成到管線中,但僅在加載托管處理程序時才這樣做。 - hemp

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