由于旧的ISAPI过滤器迟早会死掉,我想将IIS 6中使用的旧ISAPI过滤器重写为一个模块,以便在IIS 7中使用。该模块将全局使用,这意味着它将在安装了IIS 7.5的Windows Server 2008 R2上的每个站点中使用,它将托管数千个网站并管理大约50个应用程序池。
我现在的问题是,我是否应该在托管或非托管代码中编写该模块?我对托管代码的一个担忧是由于.NET框架开销导致的大量内存消耗。我不知道这会如何影响服务器的性能。
我已经在托管代码和非托管代码中编写了模块。所以这不是我的决定困扰。但是如果没有巨大的缺点,我宁愿用C#编写模块。
有关该问题的任何建议吗?
答案 0 :(得分:5)
Rick Strahl offered sound advice关于这个话题,我在lear.iis.net的文章中多次回应。
了解利用所有这些力量做错事的可能性也很重要。首先请记住,托管代码比Web服务器中的本机代码慢。通过将托管代码引入核心服务器,您正在降低Web服务器的性能。具体而言,在集成模式下运行并且存在托管模块时,托管代码和非托管代码之间的上下文切换非常昂贵。我和一些微软开发人员谈过,他们正在努力通过尽可能多地批量调用托管代码组件来优化这些上下文切换,尽可能长时间地保持托管代码。
默认情况下,托管代码是可选的 - 所有核心模块都是本机代码,因此添加托管模块是您必须做出的明确决定。 如果你已经在使用ASP.NET,那么这个决定可能是一个明智的选择。但是如果你今天正在运行原始的ISAPI扩展或模块,你可能需要长时间的努力查看托管代码是否适合性能。
简而言之,如果所有应用程序都是ASP.NET,那么为IIS编写托管模块应该有很少或没有开销 - 这是一个简单的选择。
但是,如果网站不否则将加载CLR,那么这样做以执行您的模块将是昂贵的,您将需要仔细考虑(测量!)影响确定性能影响是否值得开发时间的生产力提升。
答案 1 :(得分:1)
取决于
如果可以管理所有应用程序,请进行管理。这允许纯托管堆栈。我会推动那个;)
关于记忆 - 忘记它。认真。管理IIS 7核心,根据需要挂钩旧版堆栈。所以,无论你喜欢与否,你已经拥有了.NET。此外,现代服务器有相当多的记忆 - 即使池运行32位(强烈推荐),还有50个池;)不是服务器的64mb RAM;)