要解决这个问题,我们需要先了解ASP .网应用程序的生命周期,先看下面作者整理的一张图片
从图中我们可以清楚的看到:通用(同移民检查员移民检查)访问应用程序时,每次的单个页面统一资源定位器访问时,都会先经过超文本传送协议(Hyper Text Transport Protocol的缩写)应用程序管线处理请求,走过开始调查事件之后才会去走路由访问具体的控制器和行动,最后结束的时候会请求EndRequest事件。下面用一张图来表示这个顺序
注意图中标示的红色部分就是我们要实现的部分,实现如下:1 新建MyHandler.cs复制代码代码如下:公共类我的处理程序: ihttpm module { public void Init(Httpapplication应用程序){ application } .BeginRequest=(新的事件处理程序(这个.application _ Beginrequest));应用程序EndRequest=(新的事件处理程序(这application _ EndRequest));}私有void Application _ BeginRequest(对象源,EventArgs e) { //创建http应用程序和HttpContext对象以访问//请求和响应属性http应用程序.应用程序=(HttpApplication)源;HttpContext上下文=应用程序。语境;字符串文件路径=上下文。请求文件路径;字符串文件扩展名=VirtualPathutility .GetExtension(文件路径);if(文件扩展名.等于('。html’){上下文.响应WriteFile(上下文服务器。MapPath(文件路径));//直接走静态页面//此处可以加入缓存,条件也可以根据需要来自己定义语境。响应。end();} }私有void Application_EndRequest(对象源,事件参数e){ HttpApplication Application=(HttpApplication)源;HttpContext上下文=应用程序。语境;字符串文件路径=上下文。请求文件路径;字符串文件扩展名=VirtualPathutility .GetExtension(文件路径);if(文件扩展名.等于('。html’){上下文.响应。写入(' HRH 1字体颜色=红色' ' helloworldmodule :请求结束/font/h1’;} } public void Dispose() { } } 2 .网络。配置中加入以下代码,才会运行自定义的管道处理类复制代码代码如下: httpModules add name=' MvcTest .MyHandler' type='MvcTest .我的处理程序//httpModules运行一下自己的代码,看看效果你就全明白了!补充:根据@小尾鱼的提示,如果直接在自己的项目文件下生产了和统一资源定位器中一样的目录文件,比如访问:yourdomin.com/product/1.html,你的项目文件夹下真的存在产品/1.html这个路径,那么(同移民检查员移民检查)会直接去请求这个静态页面,如果项目中使用了自定义的管道处理程序,那么这个静态页仍然会走我们的自定义管道处理程序,我们可以在这里通过缓存来实现要不要重新成长静态页或删除过期产品的静态页,如果不使用此方法,只能去写执行计划,定时跑这些静态文件了,修改Application_BeginRequest复制代码代码如下:私有void Application_BeginRequest(对象源,EventArgs e) { //创建http应用程序和HttpContext对象以访问//请求和响应属性http应用程序.应用程序=(HttpApplication)源;HttpContext上下文=应用程序。语境;字符串文件路径=上下文。请求文件路径;字符串文件扩展名=VirtualPathutility .GetExtension(文件路径);if(文件扩展名.等于('。html '){//判断缓存是否存在,不存在加入缓存,调用生成静态的类和方法//产品过期,移除静态文件,302重定向如果(系统。文件存在(上下文服务器。映射路径(文件路径)){上下文.响应WriteFile(上下文服务器。MapPath(文件路径));语境。响应。end();} } 思路大体如此。