创建自定义 IHttpModules 时,我意识到对静态文件(例如:.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>
但是,即使使用前提条件,我也可以看到静态文件如何通过模块:
Request: /MVCX/
Request: /MVCX/Content/Site.css
Request: /MVCX/Scripts/jquery-1.4.4.min.js
我试图忽略静态文件的规则,但这没有什么区别:
routes.IgnoreRoute("{Content}/{*pathInfo}");
routes.IgnoreRoute("{Scripts}/{*pathInfo}");
这是平常的吗?或者我在这里遗漏了什么?据我所知,如果静态文件请求应该由IIS来应答。如果我的托管模块被命中,则意味着 CLR ThreadPool 线程正在处理该请求,对吧?
Regards.
UPDATE:
我已禁用“runAllManagedModulesForAllRequests”:
<modules runAllManagedModulesForAllRequests="false">
<add name="MyModule" preCondition="managedHandler" type="MVCX.Modules.MyModule, MVCX" />
</modules>
一切似乎都工作得很好,但我发现了这篇文章:http://www.britishdeveloper.co.uk/2010/06/dont-use-modules-runallmanagementmodulesfo.html建议删除并重新添加“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>
所以现在我有点困惑,这个参数的状态是什么?我应该使用它还是不应该使用它?为什么默认情况下它是“true”?
问候。