Asp.net mvc 对静态文件的请求正在访问ASP.NET MVC3中的托管代码

Asp.net mvc 对静态文件的请求正在访问ASP.NET MVC3中的托管代码,asp.net-mvc,asp.net-mvc-3,iis-7,iis-7.5,ihttpmodule,Asp.net Mvc,Asp.net Mvc 3,Iis 7,Iis 7.5,Ihttpmodule,在创建自定义IHTTP模块时,我意识到对静态文件(例如:.css和.js文件)的请求正在命中托管模块。可能图片也有同样的问题。对于文件系统中存在的文件,IIS不应该绕过ASP.NET吗 例如: public class MyModule:IHttpModule { public void Dispose(){ } public void Init(HttpApplication context) { context.BeginRequest += (o,

在创建自定义IHTTP模块时,我意识到对静态文件(例如:.css和.js文件)的请求正在命中托管模块。可能图片也有同样的问题。对于文件系统中存在的文件,IIS不应该绕过ASP.NET吗

例如:

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

    public void Init(HttpApplication context)
    {
        context.BeginRequest += (o, e) => Debug.Print("Request: " + HttpContext.Current.Request.RawUrl);
    }
}
我这样声明:

<modules runAllManagedModulesForAllRequests="true">
  <add name="MyModule" preCondition="managedHandler" type="MVCX.Modules.MyModule, MVCX"/>
</modules>
我试图忽略静态文件的规则,但这没有什么区别:

routes.IgnoreRoute("{Content}/{*pathInfo}");
routes.IgnoreRoute("{Scripts}/{*pathInfo}");
这是平常的吗?还是我在这里遗漏了什么?据我所知,静态文件请求是否应该由IIS响应。如果我的托管模块被命中,意味着CLR线程池线程正在处理该请求,对吗

问候

更新:

我已禁用“runAllManagedModulesForAllRequests”:


这建议删除并读取带有空前提条件的“UrlRoutingModule-4.0”模块

在我的机器上,该模块的添加在根web.config中,并且它已经有一个空的前提条件:

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>
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config>type machine.Config |查找“UrlRouting”
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config>键入web.Config |查找“UrlRouting”
C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config>
现在我有点困惑,这个参数的状态是什么?我应该用还是不应该用?为什么默认情况下它是“真的”


问候

我想,如果你真的想忽略,你不应该使用曲线括号:

routes.IgnoreRoute("Content/{*pathInfo}");
routes.IgnoreRoute("Scripts/{*pathInfo}");

回答您的第一个问题,即IIS应绕过ASP.NET以获取静态内容

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

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

因此,基本上,如果您使用集成模式运行所有ManagedModulesForallRequests=“true”
,则托管模块将收到每个请求事件的通知。此外,从:

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

默认值为false

文档没有解释此属性如何与
前提条件
选项交互。根据您的经验,它似乎覆盖了
前提条件
配置,因此,如果我是你,我会将其保留为
false
,只使用
前提条件
选项,即使这意味着将其他模块的前提条件更改为空字符串,以解决
runAllManagedModulesForAllRequests
更改为false的问题


更新:关于使用
runAllManagedModulesForAllRequests
的含义,如前所述,如果为true,则使用
managedHandler
选项覆盖
前提条件

还可以使用快捷方式启用所有托管(ASP.NET)模块 运行应用程序中的所有请求,而不考虑 “managedHandler”前提条件。使所有托管模块都能运行 对于所有请求,无需配置每个模块条目以删除 “managedHandler”前提条件,使用 在节中运行AllManagedModulesForallRequests属性:

使用此属性时,“managedHandler”前提条件没有 效果,所有托管模块将针对所有请求运行


您可以为此编写以下代码

routes.IgnoreRoute("{*allcss}", new { allaspx = @".*\.css(/.*)?" });
routes.IgnoreRoute("{*alljs}", new { allaspx = @".*\.js(/.*)?" });
请在下面的链接上查找更多信息

在我的机器上,该模块的添加在根web.config中,并且它已经有一个空的前提条件

太好了。这意味着该模块将始终运行,这是MVC所必需的,因为它使用无扩展URL

现在我有点困惑,这个参数的状态是什么?我应该用还是不应该用?为什么默认情况下它是“真的”

因为无扩展url支持在IIS7 SP1和IIS7.5 SP1中是新的。 IIS7提供了一个补丁,您必须请求并安装它。 您可以在这里找到完整的问题答案:

为什么默认情况下此参数为true?因为VS2010是在IIS7 SP1之前发布的。
在VS2010SP1的新MVC项目中,它可能为false?

尝试忽略所有静态文件的列表

routes.IgnoreRoute("{*staticfile}", new { staticfile = @".*\.(js|css|gif|jpg|png)(/.*)?" });

这没什么区别。模块也会被静态文件击中。唯一让人沮丧的是,这个KB需要重新启动。
routes.IgnoreRoute("{*allcss}", new { allaspx = @".*\.css(/.*)?" });
routes.IgnoreRoute("{*alljs}", new { allaspx = @".*\.js(/.*)?" });
routes.IgnoreRoute("{*staticfile}", new { staticfile = @".*\.(js|css|gif|jpg|png)(/.*)?" });