ASP.NET MVC3关于生成纯静态后如何不再走路由直接访问静态页面-阿里云开发者社区

开发者社区> 开发与运维> 正文

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

简介: 原文 http://www.cnblogs.com/wxj200589/archive/2011/12/21/mvc3-create-html.html 问题描述:高访问量类型的电子商务网站,需要将一些不是经常变化的页面生成静态页面,然后普通用户就可以直接访问这些静态页面而不用再访问需要连接数据库的动态页面。

原文 http://www.cnblogs.com/wxj200589/archive/2011/12/21/mvc3-create-html.html

问题描述:高访问量类型的电子商务网站,需要将一些不是经常变化的页面生成静态页面,然后普通用户就可以直接访问这些静态页面而不用再访问需要连接数据库的动态页面。那么ASP.NET MVC3中如何做到这一点呢?

要解决这个问题,我们需要先了解ASP.NET应用程序的生命周期,先看下面作者整理的一张图片:

ASP.NET生命周期 (2)

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

image

注意图中标示的红色部分就是我们要实现的部分,实现如下:

1 新建MyHandler.cs

public class MyHandler:IHttpModule
    {
        public void Init(HttpApplication application)
        {
            application.BeginRequest +=
                (new EventHandler(this.Application_BeginRequest));
            application.EndRequest +=
                (new EventHandler(this.Application_EndRequest));
        }
private void Application_BeginRequest(Object source,
        EventArgs e)
        {
            // Create HttpApplication and HttpContext objects to access
            // request and response properties.
            HttpApplication application = (HttpApplication)source;
            HttpContext context = application.Context;
            string filePath = context.Request.FilePath;
            string fileExtension =
                VirtualPathUtility.GetExtension(filePath);
            if (fileExtension.Equals(".html"))
            {
                context.Response.WriteFile(context.Server.MapPath(filePath));//直接走静态页面
//此处可以加入缓存,条件也可以根据需要来自己定义
                context.Response.End();
            }

        }
        private void Application_EndRequest(Object source, EventArgs e)
        {
            HttpApplication application = (HttpApplication)source;
            HttpContext context = application.Context;
            string filePath = context.Request.FilePath;
            string fileExtension =
                VirtualPathUtility.GetExtension(filePath);
            if (fileExtension.Equals(".html"))
            {
                context.Response.Write("<hr><h1><font color=red>" +
                    "HelloWorldModule: End of Request</font></h1>");
            }
        }

        public void Dispose() { }
    }

 

2. web.config中加入以下代码,才会运行自定义的管道处理类

   1:  <httpModules>
   2:        <add name="MvcTest.MyHandler" type="MvcTest.MyHandler"/>
   3:      </httpModules>

运行一下自己的代码,看看效果你就全明白了!

补充:根据@小尾鱼的提示,如果直接在自己的项目文件下生产了和URL中一样的目录文件,比如访 问:yourdomin.com/product/1.html,你的项目文件夹下真的存在product/1.html这个路径,那么IIS会直接去请 求这个静态页面,如果项目中使用了自定义的管道处理程序,那么这个静态页仍然会走我们的自定义管道处理程序,我们可以在这里通过缓存来实现要不要重新成长 静态页或删除过期产品的静态页,如果不使用此方法,只能去写执行计划,定时跑这些静态文件了,修改Application_BeginRequest

   1:  private void Application_BeginRequest(Object source,
   2:          EventArgs e)
   3:          {
   4:              // Create HttpApplication and HttpContext objects to access
   5:              // request and response properties.
   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:                  //判断缓存是否存在,不存在加入缓存,调用生成静态的类和方法
  14:                  //产品过期,移除静态文件,302重定向
  15:                  if (System.IO.File.Exists(context.Server.MapPath(filePath)))
  16:                  {
  17:                      context.Response.WriteFile(context.Server.MapPath(filePath));
  18:                      context.Response.End();
  19:                  }
  20:                  
  21:                  
  22:              }

思路大体如此。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享:
开发与运维
使用钉钉扫一扫加入圈子
+ 订阅

集结各类场景实战经验,助你开发运维畅行无忧

其他文章