Asp.net mvc 对静态文件的请求正在访问ASP.NET MVC3中的托管代码
在创建自定义IHTTP模块时,我意识到对静态文件(例如:.css和.js文件)的请求正在命中托管模块。可能图片也有同样的问题。对于文件系统中存在的文件,IIS不应该绕过ASP.NET吗 例如: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,
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)(/.*)?" });