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

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

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

注意图中标示的红色部分就是我们要实现的部分,实现如下:
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();
}
}

思路大体如此。
详细出处参考:http://www.jb51.net/article/29199.htm

时间: 2024-12-06 02:14:47

ASP.NET MVC3关于生成纯静态后如何不再走路由直接访问静态页面--收藏没测的相关文章

使用Shiro登录成功后,跳转到之前访问的页面实现

转:http://blog.csdn.net/lhacker/article/details/20450855 很多时候,我们需要做到,当用户登录成功后,跳转回登录前的页面.如果用户是点击"登录"链接去到登录页面进行登录的,我们很容易跟踪用户的登录前的页面.比如,在"登录"链接后加一个url参数,如:http://www.xxx.com/login.html?url=http://www.xxx.com/xx.html,这个url就是当前页面.用户浏览不同页面,&q

[MVC]VS2010安装ASP.NET MVC4 造成 ASP.NET MVC3项目有问题

前几天想说使用VS2010来开发ASP.NET MVC4的项目,所以就安装了ASP.NET MVC4 Installer(Visual Studio 2010). 使用VS2010开发ASP.NET MVC4粉OK! 再用VS2010开启ASP.NET MVC3的项目时,切到VIEW画面时,居然出现一堆 @Html 不认得的错误,下面的毛毛虫一堆. 只好把ASP.NET MVC4 Installer(Visual Studio 2010)移除,ASP.NET MVC3也都移除后重装ASP.NET

VUE打包好的文件部署让beego实现静态文件访问,如何用根目录来访问静态文件?

最近的一个全栈项目,光伏云监控系统,后端使用beego框架,纯api,前端使用VUE2.0.项目地址:http://scada.ssechina.com:88/static 我把打包好的前端文件放到go的static目录, 然后main里面设置 beego.BConfig.WebConfig.StaticDir["/static"] = "static"只能用ip/static/login.html来访问 如果改成beego.BConfig.WebConfig.St

利用ResultFilter实现asp.net mvc3 页面静态化

为了提高网站性能.和网站的负载能力,页面静态化是一种有效的方式,这里对于asp.net mvc3 构架下的网站,提供一种个人认为比较好的静态话方式. 实现原理是通过mvc提供的过滤器扩展点实现页面内容的文本保存,直接上代码: 1 public class StaticFileWriteFilterAttribute : FilterAttribute, IResultFilter 2 { 3 public void OnResultExecuted(ResultExecutedContext f

ZBLOG系统PHP程序无法生成纯HTML静态网页导致的2大缺陷

最近在研究ZBLOG系统,其中有ASP版本,可以搭配ACCESS和MS-SQL数据库,也都有生成HTML纯静态网页文件的插件,虽然对于ZBLOG2.1-2.2的ASP版本来说,静态化插件没有及时更新,导致提交网页后在后台无法跳转的小问题,但还是可以用的,目前来说,除了在选择数据库版本的时候要谨慎一些,别的没有什么问题.重点在于不要选择SQL SERVER2012及更高的版本,因为会出现重启SQL SERVER服务器后自增列出现跳跃1000的问题,对于我来说,心里非常不爽,而且目前来说没有良好的解

小蚂蚁学习页面静态化(2)——更新生成纯静态化页面的三种方式

更新生成纯静态化页面的三种方式:1.按照时间间隔更新.2.手动更新.3.定时更新(需要系统配合). 1. 按照时间间隔更新. 当用户第一次访问这个页面的时候,程序自动判断,该静态文件是否存在,并且该文件是否还在有效时间内,如果该文件未超出了有效时间,用户访问的是已经生成的静态文件.如果超出了有效时间,用户得到的是动态输出的内容,同时重新生成静态文件.稍微修改一下昨天的代码为例: <?php //首先判断是否有静态文件,并且文件的最新修改时间到现在是否大于20秒 if(is_file('./tex

Mono和Jexus并且部署ASP.NET MVC3、4、5和WebApi

Linux(CentOS 6.7)下配置Mono和Jexus并且部署ASP.NET MVC3.4.5和WebApi(跨平台) 1.开篇说明 a. 首先我在写这篇博客之前,已经在自己本地配置了mono和jexus并且成功部署了asp.net mvc项目,我也是依赖于在网上查找的各种资料来配置环境并且部署项目的,而其在网上也已有了很多这方面的文章,故而我就想我是写还是不写呢,但是想来想去,我还是写一下吧,因为网上的文章太杂乱,不是最新版本,不是很整齐并且也可能会遇到各种各样的问题,所以我决定写一篇从

经典ASP.NET MVC3.0入门详解

http://blog.csdn.net/csh624366188/article/details/7064269 :由于本文原在word文档里编写,写本文章时运用了大量截图,直接复制到博客里,没有显示图片, 图片只是一些简单的运行结果截图,不影响大家学习 p.Net MVC已经到第三版了,相信大家也都熟悉了,我也不再重复相关概念性的东西了.但是大家一定要了解,Asp.Net MVC是微软的一 个开源的UI层框架,是AspNet的另外一种开发模式.好废话不多说,那我们开始进入Asp.Net MV

ASP.NET MVC3中Model验证

原文:ASP.NET MVC3中Model验证 概述 上节我们学习了Model的数据在界面之间的传递,但是很多时候,我们在数据传递的时候为了确保数据的有效性,不得不给Model的相关属性做基本的数据验证. 本节我们就学习如何使用 System.ComponentModel.DataAnnotations 命名空间中的特性指定对数据模型中的各个字段的验证. 这些特性用于定义常见的验证模式,例如范围检查和必填字段.而 DataAnnotations 特性使 MVC 能够提供客户端和服务器验证检查,使