找回密码
 立即注册
首页 业界区 业界 ASP.NET MVC3关于生成纯静态后如何不再走路由直接访问静 ...

ASP.NET MVC3关于生成纯静态后如何不再走路由直接访问静态页面

扎先 2025-5-29 16:06:56
问题描述:高访问量类型的电子商务网站,需要将一些不是经常变化的页面生成静态页面,然后普通用户就可以直接访问这些静态页面而不用再访问需要连接数据库的动态页面。那么ASP.NET MVC3中如何做到这一点呢?
  要解决这个问题,我们需要先了解ASP.NET应用程序的生命周期,先看下面作者整理的一张图片:
  
1.jpeg

  从图中我们可以清楚的看到:通用IIS访问应用程序时,每次的单个页面URL访问时,都会先经过HttpApplication 管线处理请求,走过BeginRequest 事件之后才会去走路由访问具体的Controller和Action,最后结束的时候会请求EndRequest事件。下面用一张图来表示这个顺序:
  
2.png

  注意图中标示的红色部分就是我们要实现的部分,实现如下:
  1 新建MyHandler.cs
  1. public class MyHandler:IHttpModule
  2.     {
  3.         public void Init(HttpApplication application)
  4.         {
  5.             application.BeginRequest +=
  6.                 (new EventHandler(this.Application_BeginRequest));
  7.             application.EndRequest +=
  8.                 (new EventHandler(this.Application_EndRequest));
  9.         }
  10. private void Application_BeginRequest(Object source,
  11.         EventArgs e)
  12.         {
  13.             // Create HttpApplication and HttpContext objects to access
  14.             // request and response properties.
  15.             HttpApplication application = (HttpApplication)source;
  16.             HttpContext context = application.Context;
  17.             string filePath = context.Request.FilePath;
  18.             string fileExtension =
  19.                 VirtualPathUtility.GetExtension(filePath);
  20.             if (fileExtension.Equals(".html"))
  21.             {
  22.                 context.Response.WriteFile(context.Server.MapPath(filePath));//直接走静态页面
复制代码
  1. //此处可以加入缓存,条件也可以根据需要来自己定义
复制代码
  1.                 context.Response.End();
  2.             }
  3.         }
  4.         private void Application_EndRequest(Object source, EventArgs e)
  5.         {
  6.             HttpApplication application = (HttpApplication)source;
  7.             HttpContext context = application.Context;
  8.             string filePath = context.Request.FilePath;
  9.             string fileExtension =
  10.                 VirtualPathUtility.GetExtension(filePath);
  11.             if (fileExtension.Equals(".html"))
  12.             {
  13.                 context.Response.Write("<hr><h1><font color=red>" +
  14.                     "HelloWorldModule: End of Request</font></h1>");
  15.             }
  16.         }
  17.         public void Dispose() { }
  18.     }
复制代码
 
2. web.config中加入以下代码,才会运行自定义的管道处理类
  1.    1:  <httpModules>
复制代码
  1.    2:        
复制代码
  1.    3:      </httpModules>
复制代码
运行一下自己的代码,看看效果你就全明白了!
补充:根据@小尾鱼的提示,如果直接在自己的项目文件下生产了和URL中一样的目录文件,比如访问:yourdomin.com/product/1.html,你的项目文件夹下真的存在product/1.html这个路径,那么IIS会直接去请求这个静态页面,如果项目中使用了自定义的管道处理程序,那么这个静态页仍然会走我们的自定义管道处理程序,我们可以在这里通过缓存来实现要不要重新成长静态页或删除过期产品的静态页,如果不使用此方法,只能去写执行计划,定时跑这些静态文件了,修改Application_BeginRequest
  1.    1:  <httpModules>private void Application_BeginRequest(Object source,
复制代码
  1.    2:          EventArgs e)
复制代码
  1.    3:      </httpModules>    {
复制代码
  1.    4:              // Create HttpApplication and HttpContext objects to access
复制代码
  1.    5:              // request and response properties.
复制代码
  1.    6:              HttpApplication application = (HttpApplication)source;
复制代码
  1.    7:              HttpContext context = application.Context;
复制代码
  1.    8:              string filePath = context.Request.FilePath;
复制代码
  1.    9:              string fileExtension =
复制代码
  1.   10:                  VirtualPathUtility.GetExtension(filePath);
复制代码
  1.   11:              if (fileExtension.Equals(".html"))
复制代码
  1.   12:              {
复制代码
  1.   13:                  //判断缓存是否存在,不存在加入缓存,调用生成静态的类和方法
复制代码
  1.   14:                  //产品过期,移除静态文件,302重定向
复制代码
  1.   15:                  if (System.IO.File.Exists(context.Server.MapPath(filePath)))
复制代码
  1.   16:                  {
复制代码
  1.   17:                      context.Response.WriteFile(context.Server.MapPath(filePath));
复制代码
  1.   18:                      context.Response.End();
复制代码
  1.   19:                  }
复制代码
  1.   20:                  
复制代码
  1.   21:                  
复制代码
  1.   22:              }
复制代码
思路大体如此。
来源:程序园用户自行投稿发布,如果侵权,请联系站长删除
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
您需要登录后才可以回帖 登录 | 立即注册