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

 更新时间:2011年12月22日 21:54:31   作者:  
高访问量类型的电子商务网站,需要将一些不是经常变化的页面生成静态页面,然后普通用户就可以直接访问这些静态页面而不用再访问需要连接数据库的动态页面。那么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中加入以下代码,才会运行自定义的管道处理类
复制代码 代码如下:

<httpModules>
<add name="MvcTest.MyHandler" type="MvcTest.MyHandler"/>
</httpModules>

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

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"))
{
//判断缓存是否存在,不存在加入缓存,调用生成静态的类和方法
//产品过期,移除静态文件,302重定向
if (System.IO.File.Exists(context.Server.MapPath(filePath)))
{
context.Response.WriteFile(context.Server.MapPath(filePath));
context.Response.End();
}
}

思路大体如此。

相关文章

  • ASP.NET中application对象的使用介绍

    ASP.NET中application对象的使用介绍

    这篇文章主要介绍了ASP.NET中application对象的使用,需要的朋友可以参考下
    2014-04-04
  • ASP.NET中Web.config文件的层次关系详细介绍

    ASP.NET中Web.config文件的层次关系详细介绍

    Web.config 是一个基于 XML 的配置文件,该文件的作用是对应用程序进行配置,下面为大家介绍下ASP.NET中Web.config文件的层次关系
    2014-01-01
  • 浅谈ASP.NET的Postback 实例代码

    浅谈ASP.NET的Postback 实例代码

    说道ASP.NET的Postback,就得说Web Page的生命周期,但是Web Page的生命周期却不是三言两语就能够说得清楚的,所以在这里单纯站的编程的角度,撇开Web Page 的生命周期浅谈Postback。
    2009-08-08
  • 利用Aspose.Cells实现万能导出功能

    利用Aspose.Cells实现万能导出功能

    这篇文章主要为大家详细介绍了利用Aspose.Cells实现万能导出功能,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-12-12
  • .net面向对象之多线程(Multithreading)及 多线程高级应用

    .net面向对象之多线程(Multithreading)及 多线程高级应用

    这篇文章主要介绍.net面向对象程序设计阶段多线程Multithreading及多线程高级应用的介绍,需要的朋友可以参考下
    2015-07-07
  • .net中的session与cookies区别及使用方法

    .net中的session与cookies区别及使用方法

    cookie数据存放在客户的浏览器上,session数据放在服务器上,cookie不是很安全,别人可以分析存放在本地的COOKIE并进行COOKIE欺骗,考虑到安全应当使用session
    2013-04-04
  • .Net8.0 WebApi发布到IIS详细步骤

    .Net8.0 WebApi发布到IIS详细步骤

    本文主要介绍了.Net8.0 WebApi发布到IIS详细步骤, 文中通过图文介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-05-05
  • 使用.NET 6开发TodoList应用之引入数据存储的思路详解

    使用.NET 6开发TodoList应用之引入数据存储的思路详解

    在这篇文章中,我们仅讨论如何实现数据存储基础设施的引入,具体的实体定义和操作后面专门来说。对.NET 6开发TodoList引入数据存储相关知识感兴趣的朋友一起看看吧
    2021-12-12
  • .NET 内存管理两种有效的资源释放方式详解

    .NET 内存管理两种有效的资源释放方式详解

    在.NET中,内存管理主要依赖垃圾回收(GC),但对于非托管资源如文件句柄、数据库连接等,需要更细粒度的控制,介绍了使用using语句和显式调用Dispose方法两种方式来管理这些资源,避免内存泄漏,感兴趣的朋友跟随小编一起看看吧
    2024-10-10
  • .Net  垃圾回收机制详细介绍

    .Net 垃圾回收机制详细介绍

    这篇文章主要介绍了.Net 垃圾回收机制详细介绍的相关资料,这里对垃圾回收机制做了详细的讲解,需要的朋友可以参考下
    2016-11-11

最新评论