asp.net mvc3的静态化实现
静态化处理,可以大大提高客户的访问浏览速度,提高用户体验,同时也降低了服务器本身的压力。在asp.net mvc3中,可以相对容易地处理静态化问题,不用过多考虑静态网页的同步,生成等等问题。我提供这个方法很简单,就需要在需要静态化处理的Controller或Action上加一个Attribute就可以。下面是我写的一个生成静态文件的ActionFilterAttribute。
1 using System;
2 using System.IO;
3 using System.Text;
4 using System.Web;
5 using System.Web.Mvc;
6 using NLog;
7
8 /// <summary>
9 /// 生成静态文件
10 /// </summary>
11 [AttributeUsage(AttributeTargets.Class | AttributeTargets.Method, Inherited = true, AllowMultiple = true)]
12 public class GenerateStaticFileAttribute : ActionFilterAttribute
13 {
14 #region 私有属性
15
16 private static readonly Logger logger = LogManager.GetCurrentClassLogger();
17
18 #endregion
19
20 #region 公共属性
21
22 /// <summary>
23 /// 过期时间,以小时为单位
24 /// </summary>
25 public int Expiration { get; set; }
26
27 /// <summary>
28 /// 文件后缀名
29 /// </summary>
30 public string Suffix { get; set; }
31
32 /// <summary>
33 /// 缓存目录
34 /// </summary>
35 public string CacheDirectory { get; set; }
36
37 /// <summary>
38 /// 指定生成的文件名
39 /// </summary>
40 public string FileName { get; set; }
41
42 #endregion
43
44 #region 构造函数
45
46 /// <summary>
47 /// 默认构造函数
48 /// </summary>
49 public GenerateStaticFileAttribute()
50 {
51 Expiration = 1;
52 CacheDirectory = AppDomain.CurrentDomain.BaseDirectory;
53 }
54
55 #endregion
56
57 #region 方法
58
59 public override void OnResultExecuted(ResultExecutedContext filterContext)
60 {
61 var fileInfo = GetCacheFileInfo(filterContext);
62
63 if ((fileInfo.Exists && fileInfo.CreationTime.AddHours(Expiration) < DateTime.Now) || !fileInfo.Exists)
64 {
65 var deleted = false;
66
67 try
68 {
69 if (fileInfo.Exists)
70 {
71 fileInfo.Delete();
72 }
73
74 deleted = true;
75 }
76 catch (Exception ex)
77 {
78 logger.Error("删除文件:{0}发生异常:{1}", fileInfo.FullName, ex.StackTrace);
79 }
80
81 var created = false;
82
83 try
84 {
85 if (!fileInfo.Directory.Exists)
86 {
87 fileInfo.Directory.Create();
88 }
89
90 created = true;
91 }
92 catch (IOException ex)
93 {
94 logger.Error("创建目录:{0}发生异常:{1}", fileInfo.DirectoryName, ex.StackTrace);
95 }
96
97 if (deleted && created)
98 {
99 FileStream fileStream = null;
100 StreamWriter streamWriter = null;
101
102 try
103 {
104 var viewResult = filterContext.Result as ViewResult;
105 fileStream = new FileStream(fileInfo.FullName, FileMode.CreateNew, FileAccess.Write, FileShare.None);
106 streamWriter = new StreamWriter(fileStream);
107 var viewContext = new ViewContext(filterContext.Controller.ControllerContext, viewResult.View, viewResult.ViewData, viewResult.TempData, streamWriter);
108 viewResult.View.Render(viewContext, streamWriter);
109 }
110 catch (Exception ex)
111 {
112 logger.Error("生成缓存文件:{0}发生异常:{1}", fileInfo.FullName, ex.StackTrace);
113 }
114 finally
115 {
116 if (streamWriter != null)
117 {
118 streamWriter.Close();
119 }
120
121 if (fileStream != null)
122 {
123 fileStream.Close();
124 }
125 }
126 }
127 }
128 }
129
130 /// <summary>
131 /// 生成文件Key
132 /// </summary>
133 /// <param name="controllerContext">ControllerContext</param>
134 /// <returns>文件Key</returns>
135 protected virtual string GenerateKey(ControllerContext controllerContext)
136 {
137 var url = controllerContext.HttpContext.Request.Url.ToString();
138
139 if (string.IsNullOrWhiteSpace(url))
140 {
141 return null;
142 }
143
144 var th = new TigerHash();
145 var data = th.ComputeHash(Encoding.Unicode.GetBytes(url));
146 var key = Convert.ToBase64String(data, Base64FormattingOptions.None);
147 key = HttpUtility.UrlEncode(key);
148
149 return key;
150 }
151
152 /// <summary>
153 /// 获取静态的文件信息
154 /// </summary>
155 /// <param name="controllerContext">ControllerContext</param>
156 /// <returns>缓存文件信息</returns>
157 protected virtual FileInfo GetCacheFileInfo(ControllerContext controllerContext)
158 {
159 var fileName = string.Empty;
160
161 if (string.IsNullOrWhiteSpace(FileName))
162 {
163 var key = GenerateKey(controllerContext);
164
165 if (!string.IsNullOrWhiteSpace(key))
166 {
167 fileName = Path.Combine(CacheDirectory, string.IsNullOrWhiteSpace(Suffix) ? key : string.Format("{0}.{1}", key, Suffix));
168 }
169 }
170 else
171 {
172 fileName = Path.Combine(CacheDirectory, FileName);
173 }
174
175 return new FileInfo(fileName);
176 }
177
178 #endregion
179 }
如果大家对于生成的文件和目录有特殊的要求,那可以重写GetCacheFileInfo方法,比如按照日期生成目录等等更复杂的目录和文件结构。当然以上代码只是提供了生成静态页的方法,但是访问如何解决呢? 访问静态文件和规则就需要在HttpApplication的Application_BeginRequest实现了。首先可以设置需要静态化访问的路由地址以html结尾。下面的是一个用于首页的静态化访问的实现,很简单,当然你可以实现比较复杂的逻辑,比如根据文件时间来判断是否应该访问静态文件等等。
1 protected void Application_BeginRequest(object sender, EventArgs e)
2 {
3 StaticContentRewrite();
4 }
5
6 /// <summary>
7 /// 处理静态发布内容
8 /// </summary>
9 private void StaticContentRewrite()
10 {
11 if (Context.Request.FilePath == "/" || Context.Request.FilePath.StartsWith("/index.html", StringComparison.OrdinalIgnoreCase))
12 {
13 if (File.Exists(Server.MapPath("index.html")))
14 {
15 Context.RewritePath("index.html");
16 }
17 }
18 }
asp.net mvc3的静态化实现的更多相关文章
- 利用ResultFilter实现asp.net mvc3 页面静态化
为了提高网站性能.和网站的负载能力,页面静态化是一种有效的方式,这里对于asp.net mvc3 构架下的网站,提供一种个人认为比较好的静态话方式. 实现原理是通过mvc提供的过滤器扩展点实现页面内容 ...
- Asp.Net MVC页面静态化功能实现一:利用IHttpModule和ResultFilter
由于公司现在所采用的是一套CMS内容管理系统的框架,所以最近项目中有一个需求提到要求实现页面静态化的功能.在网上查询了一些资料和文献,最后采用的是小尾鱼的池塘提供的 利用ResultFilter实现a ...
- ASP.NET MVC 页面静态化操作的思路
本文主要讲述了在asp.net mvc中,页面静态化的几种思路和方法.对于网站来说,生成纯html静态页面除了有利于seo外,还可以减轻网站的负载能力和提高网站性能.在asp.net mvc中,视图的 ...
- Asp.Net MVC页面静态化功能实现二:用递归算法来实现
上一篇提到采用IHttpModule来实现当用户访问网站的时候,通过重新定义Response.Filter来实现将返回给客户端的html代码保存,以便用户下一次访问是直接访问静态页面. Asp.Net ...
- Asp.Net MVC页面静态化功能实现一:利用IHttpModule,摒弃ResultFilter
上一篇有提到利用IHttpModule和ResultFilter实现页面静态化功能.后来经过一些改动,将ResultFilter中要实现的功能全部转移到IHttpModule中来实现 Asp.Net ...
- ASP.NET 页面双向静态化
而我们预期的结果应该如下图,实际只请求两次. 用301重定向可以解决该循环请求产生的问题. OK, let's begin. 本文的Demo和Source是基于上一篇的,如果下面的一些文件或文件夹没有 ...
- Asp.net动态页面静态化之初始NVelocity模板引擎
Asp.net动态页面静态化之初始NVelocity模板引擎 静态页面是网页的代码都在页面中,不须要运行asp,php,jsp,.net等程序生成client网页代码的网页,静态页面网址中一般不含&q ...
- 利用ResultFilter实现asp.net mvc 页面静态化
为了提高网站性能.和网站的负载能力,页面静态化是一种有效的方式,这里对于asp.net mvc3 构架下的网站,提供一种个人认为比较好的静态话方式. 实现原理是通过mvc提供的过滤器扩展点实现页面内容 ...
- Asp.net Mvc 页面静态化
http://www.cnblogs.com/gowhy/archive/2013/01/01/2841472.html
随机推荐
- java 垃圾回收之标记算法
对象被判定为垃圾的标准 1.没有被其他对象引用 判定对象是否为垃圾的算法 1.引用计数算法(不是主流垃圾回收机制) 1.1 判定对象的引用数量 1.1.1 通过判断对象的引用数量来决定对象是否可以被回 ...
- 896. Monotonic Array@python
An array is monotonic if it is either monotone increasing or monotone decreasing. An array A is mono ...
- CAS机制(多线程)
---- 什么是CAS机制 CAS机制主要是发生于Java中原子操作类(JUC)的底层实现中,其中在CAS机制中包含3个基本参数:内存地址V.旧预期值A.要修改的新值B. 当要更新一个变量的时候,只有 ...
- mysql 删除恢复
一.模拟误删除数据表的恢复 1 二进制日志功能启用 vim /etc/my.cnf [mysqld] log-bin 2 完全备份 mysqldump -A -F --master-data=2 - ...
- 性能优化 java 24 次阅读 · 读完需要 15 分钟 0
摘要: 技术传播的价值,不仅仅体现在通过商业化产品和开源项目来缩短我们构建应用的路径,加速业务的上线速率,也会体现在优秀程序员在工作效率提升.产品性能优化和用户体验改善等小技巧方面的分享,以提高我们的 ...
- Spring使用JdbcTemplate实现对数据库操作
https://www.cnblogs.com/tuhooo/p/6491913.html https://blog.csdn.net/maodoubi/article/details/4826723 ...
- hdu 分类
HDU分类 http://www.cnblogs.com/ACMan/archive/2012/05/26/2519550.html#2667329 努力A完.方便自己系统A题 不断更新中...... ...
- HTTP错误:java.lang.IllegalArgumentException: Illegal character in scheme at index 0: http://xxxxxx
读取T卡文件里的域名,HTTP请求出现如下错误 java.lang.IllegalArgumentException: Illegal character in scheme at index 0: ...
- [NOIP2003] 提高组 洛谷P1038 神经网络
题目背景 人工神经网络(Artificial Neural Network)是一种新兴的具有自我学习能力的计算系统,在模式识别.函数逼近及贷款风险评估等诸多领域有广泛的应用.对神经网络的研究一直是当今 ...
- 【HDOJ6301】Distinct Values(贪心,set)
题意:给定一个n个数的数列与m个区间,要求每个区间内的数字互不相同,求使得数列字典序最小的方案 n<=1e5 思路: #include<cstdio> #include<vec ...