HttpModule的性能是否与RAMMFAR一样糟糕?

时间:2014-03-06 17:02:32

标签: asp.net httpmodule

我知道我们应该小心使用RAMMFAR(runAllManagedModulesForAllRequests),例如this Hanselman post中的建议。原因是它将所有请求发送到每个托管模块。

但我最近不得不创建一个HttpModule,我注意到它无论如何都得到了所有请求(因为这就是模块的用途),现在我想知道设置RAMMFAR = true和简单之间是否有任何性能差异拥有托管模块,如果该模块将获得所有请求。

换句话说,管理模块是否被视为对性能有害?如果我测试网址并忽略我不关心的请求,那会不会影响我的可扩展性?

编辑:根据所有请求,我的意思是我看到了静态内容的请求,例如磁盘上的css,js和jpg文件。

编辑:模块注册如下:

<modules>
  <add name="MyModule" type="MyNamespace.MyModule, MyAssembly"/>
</modules>

1 个答案:

答案 0 :(得分:3)

您的帖子中有几个问题。我会尝试单独解决它们。

虚拟(无操作)托管模块是否会影响性能/吞吐量?

是的,从IIS和ASP.NET需要协调本机&lt; - &gt;的角度来看托管代码转换,这种转换会产生一些开销。对于绝大多数应用程序而言,这种开销与实际应用程序逻辑相比相形见绌。这往往会出现在配置文件中的应用程序类型是每秒服务数万或数十万个请求的站点。此时,我们通常建议您密切关注应用程序中包含哪些模块,并尽可能地将其修剪下来。

为什么我的模块会运行静态文件?

因为模块上没有 managedHandler 前提条件。如果模块声明中存在此前提条件,则此模块仅在请求发往托管端点(.aspx,.axd,extensionless等)时才会运行。如果不存在此前提条件,则模块始终运行。

指定 managedHandler 前提条件:

<modules>
  <add name="..." type="..." preCondition="managedHandler" />
</modules>

注意:如果您使用的是IIS 7.0或7.5,则可能需要安装修补程序http://support.microsoft.com/kb/980368才能使IIS将无扩展名的URL视为“托管”端点。

RAMMFAR实际上做了什么?

简而言之,它忽略了模块注册中指定的前提条件。它的名称暗示:它为所有请求运行所有 managedHandler 模块,即使这些请求不是发往托管端点的。