对静态文件的请求正在命中ASP.NET MVC3中的托管代码

vto*_*ola 10 asp.net-mvc iis-7 ihttpmodule iis-7.5 asp.net-mvc-3

创建自定义IHttpModules,我意识到静态文件(例如:.css和.js文件)的请求正在访问托管模块.可能图片有同样的问题.IIS是否应该绕过文件系统中存在的文件?

例如:

public class MyModule:IHttpModule
{
    public void Dispose(){ }

    public void Init(HttpApplication context)
    {
        context.BeginRequest += (o, e) => Debug.Print("Request: " + HttpContext.Current.Request.RawUrl);
    }
}
Run Code Online (Sandbox Code Playgroud)

我这样声明:

<modules runAllManagedModulesForAllRequests="true">
  <add name="MyModule" preCondition="managedHandler" type="MVCX.Modules.MyModule, MVCX"/>
</modules>
Run Code Online (Sandbox Code Playgroud)

但是,即使使用前提条件,我也可以看到静态文件如何通过模块:

Request: /MVCX/
Request: /MVCX/Content/Site.css
Request: /MVCX/Scripts/jquery-1.4.4.min.js
Run Code Online (Sandbox Code Playgroud)

我试图忽略静态文件的规则,但它没有区别:

routes.IgnoreRoute("{Content}/{*pathInfo}");
routes.IgnoreRoute("{Scripts}/{*pathInfo}");
Run Code Online (Sandbox Code Playgroud)

这是通常的吗?或者我在这里遗漏了什么?据我所知,如果静态文件请求应由IIS回答.如果我的托管模块被命中,意味着CLR ThreadPool线程正在处理该请求,对吧?

问候.

更新:

我已禁用"runAllManagedModulesForAllRequests":

<modules runAllManagedModulesForAllRequests="false">
      <add name="MyModule" preCondition="managedHandler" type="MVCX.Modules.MyModule, MVCX" />
</modules>
Run Code Online (Sandbox Code Playgroud)

一切似乎工作得很好,但我发现这篇文章:http://www.britishdeveloper.co.uk/2010/06/dont-use-modules-runallmanagedmodulesfo.html建议删除并读取"UrlRoutingModule-4.0 "具有空前置条件的模块.

我的机器,添加该模块在根web.config中,它已经是一个空的preCondition:

C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config>type machine.config | find "UrlRouting"


C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config>type web.config | find "UrlRouting"
            <add name="UrlRoutingModule-4.0" type="System.Web.Routing.UrlRoutingModule" />

C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config>
Run Code Online (Sandbox Code Playgroud)

所以现在我有点困惑,这个参数的状态是什么?我应该使用它还是不应该使用它?为什么它默认为"真实"?

问候.

Joã*_*elo 9

回答你关于IIS应该绕过ASP.NET获取静态内容这一事实的第一个问题.

如果在集成模式下配置,IIS 7.5将允许托管模块注册与传统上不由ASP.NET处理的请求相关的事件,如静态文件.

这种情况在IIS 7.5经典模式中不会发生,类似于IIS 6,并且不允许托管模块侦听未由ASP.NET处理的请求中的事件.

因此,基本上如果您runAllManagedModulesForAllRequests="true"使用集成模式,则会向您的托管模块通知每个请求的事件.另外,从以下文档runAllManagedModulesForAllRequests:

如果所有托管模块都可以处理所有请求,则为True,即使请求不是托管内容; 否则,错误.

默认值为false.

该文档未解释此属性如何与该preCondition选项交互.根据您的经验,它似乎覆盖了preCondition配置,所以如果你是我,我会留下它false并且只是使用preCondition选项,即使它意味着将其他模块前置条件改为空字符串以解决runAllManagedModulesForAllRequests变为false的问题.


更新: 找到一些关于使用的含义的文档,runAllManagedModulesForAllRequests如上所述,如果为true,则为preCondition带有managedHandler选项的覆盖.

您还可以使用快捷方式为应用程序中的所有请求启用所有托管(ASP.NET)模块,而不管"managedHandler"前提条件如何.要在不配置每个模块条目的情况下为所有请求运行所有托管模块以删除"managedHandler"前置条件,请使用以下部分中的runAllManagedModulesForAllRequests属性:

使用此属性时,"managedHandler"前提条件无效,并且所有受管模块都针对所有请求运行.


Sof*_*ion 6

我的机器,该模块的添加位于根web.config中,并且它已经是一个空的preCondition

完善.这意味着该模块将始终运行,这是MVC所需的,因为它使用无扩展的URL.

所以现在我有点困惑,这个参数的状态是什么?我应该使用它还是不应该使用它?为什么它默认为"真实"?

因为无扩展URL支持是IIS7 SP1和IIS7.5 SP1中的新增功能.它可用于IIS7作为您必须请求和安装的补丁.您可以在此处找到完整的问题解答:http: //support.microsoft.com/kb/980368

为什么默认情况下此参数为真?因为VS2010是在IIS7 SP1之前发布的.也许在VS2010SP1的新MVC项目中它是假的?