惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Jina AI
Jina AI
T
The Blog of Author Tim Ferriss
B
Blog
L
LangChain Blog
Y
Y Combinator Blog
美团技术团队
博客园 - 三生石上(FineUI控件)
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
G
Google Developers Blog
量子位
博客园_首页
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
C
Check Point Blog
D
Docker
小众软件
小众软件
The Cloudflare Blog
大猫的无限游戏
大猫的无限游戏
T
Tailwind CSS Blog
Apple Machine Learning Research
Apple Machine Learning Research
博客园 - 聂微东
Blog — PlanetScale
Blog — PlanetScale
GbyAI
GbyAI
Google DeepMind News
Google DeepMind News
IT之家
IT之家

博客园 - ZYB

redis文章索引 memcache文章索引 Redis文章索引 Windows 性能监视器的基本指标(CPU,内存,硬盘参数) Advanced Logging: 伺服器記錄管理的好幫手(台湾微软 IIS 官方网站 ) MySpace DataRelay 分布式数据缓存源码分析[转] Mono for Android 篇二 使用Spinner 实现下拉列表读取Browser.BookmarksUri Mono for Android 篇一 环境的搭建 在vs2010中使用nuget安装EF5报错解决方案 装饰器模式 Sql server 2008 的完成备份和差异备份 将Microsoft Ajax Minifier集成到VS2010对JS,CSS进行编译时压缩 ubuntu 10.4.4 server下AWStats分析和查看Nginx的web访问日志 securecrt_linux客户端连接工具连接不上VM中的ubuntu discuz!nt 论坛不能显示upload orumicons下图片的问题 ubuntu软件中心崩溃解决方法 兼容Firefox和IE5+的去掉textbox自动完成输入 教你轻轻松松打包Web应用 八款开源 Android 游戏引擎 (巨好的资源)
利用ResultFilter实现asp.net mvc 页面静态化
ZYB · 2015-01-09 · via 博客园 - ZYB

为了提高网站性能、和网站的负载能力,页面静态化是一种有效的方式,这里对于asp.net mvc3 构架下的网站,提供一种个人认为比较好的静态话方式。

实现原理是通过mvc提供的过滤器扩展点实现页面内容的文本保存,直接上代码:

public class StaticFileWriteFilterAttribute : FilterAttribute, IResultFilter
{
public void OnResultExecuted(ResultExecutedContext filterContext)
{

}

public void OnResultExecuting(ResultExecutingContext filterContext)
{
filterContext.HttpContext.Response.Filter = new StaticFileWriteResponseFilterWrapper(filterContext.HttpContext.Response.Filter, filterContext);
}

class StaticFileWriteResponseFilterWrapper : System.IO.Stream
{
private System.IO.Stream inner;
private ControllerContext context;
public StaticFileWriteResponseFilterWrapper(System.IO.Stream s,ControllerContext context)
{
this.inner = s;
this.context = context;
}

public override bool CanRead
{
get { return inner.CanRead; }
}

public override bool CanSeek
{
get { return inner.CanSeek; }
}

public override bool CanWrite
{
get { return inner.CanWrite; }
}

public override void Flush()
{
inner.Flush();
}

public override long Length
{
get { return inner.Length; }
}

public override long Position
{
get
{
return inner.Position;
}
set
{
inner.Position = value;
}
}

public override int Read(byte[] buffer, int offset, int count)
{
return inner.Read(buffer, offset, count);
}

public override long Seek(long offset, System.IO.SeekOrigin origin)
{
return inner.Seek(offset, origin);
}

public override void SetLength(long value)
{
inner.SetLength(value);
}

public override void Write(byte[] buffer, int offset, int count)
{
inner.Write(buffer, offset, count);
try
{
string p = context.HttpContext.Server.MapPath(HttpContext.Current.Request.Path);

if (Path.HasExtension(p))
{
string dir = Path.GetDirectoryName(p);
if (!Directory.Exists(dir))
{
Directory.CreateDirectory(dir);
}
if (File.Exists(p))
{
File.Delete(p);
}
File.AppendAllText(p, System.Text.Encoding.UTF8.GetString(buffer));
}
}
catch
{

}
}
}
}

我们的类StaticFileWriteFilterAttribute实现了IResultFilter,这个接口有两个方法,OnResultExecuted和OnResultExecuting,其中OnResultExecuting是在controller中的action代码执行完毕后,但viewresult执行之前(即页面内容生成之前)执行;OnResultExecuted方法是在viewresult执行之后(即页面内容生成之后)执行。

我们在页面生成之前将StaticFileWriteResponseFilterWrapper类注册给Response对象的Filter属性,这里使用包装类可以在没有副作用的情况下注入页面内容静态化的代码,对于处理业务逻辑的action是透明的。