静态化处理,可以大大提高客户的访问浏览速度,提高用户体验,同时也降低了服务器本身的压力。在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的静态化实现的更多相关文章

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

    为了提高网站性能.和网站的负载能力,页面静态化是一种有效的方式,这里对于asp.net mvc3 构架下的网站,提供一种个人认为比较好的静态话方式. 实现原理是通过mvc提供的过滤器扩展点实现页面内容 ...

  2. Asp.Net MVC页面静态化功能实现一:利用IHttpModule和ResultFilter

    由于公司现在所采用的是一套CMS内容管理系统的框架,所以最近项目中有一个需求提到要求实现页面静态化的功能.在网上查询了一些资料和文献,最后采用的是小尾鱼的池塘提供的 利用ResultFilter实现a ...

  3. ASP.NET MVC 页面静态化操作的思路

    本文主要讲述了在asp.net mvc中,页面静态化的几种思路和方法.对于网站来说,生成纯html静态页面除了有利于seo外,还可以减轻网站的负载能力和提高网站性能.在asp.net mvc中,视图的 ...

  4. Asp.Net MVC页面静态化功能实现二:用递归算法来实现

    上一篇提到采用IHttpModule来实现当用户访问网站的时候,通过重新定义Response.Filter来实现将返回给客户端的html代码保存,以便用户下一次访问是直接访问静态页面. Asp.Net ...

  5. Asp.Net MVC页面静态化功能实现一:利用IHttpModule,摒弃ResultFilter

    上一篇有提到利用IHttpModule和ResultFilter实现页面静态化功能.后来经过一些改动,将ResultFilter中要实现的功能全部转移到IHttpModule中来实现 Asp.Net ...

  6. ASP.NET 页面双向静态化

    而我们预期的结果应该如下图,实际只请求两次. 用301重定向可以解决该循环请求产生的问题. OK, let's begin. 本文的Demo和Source是基于上一篇的,如果下面的一些文件或文件夹没有 ...

  7. Asp.net动态页面静态化之初始NVelocity模板引擎

    Asp.net动态页面静态化之初始NVelocity模板引擎 静态页面是网页的代码都在页面中,不须要运行asp,php,jsp,.net等程序生成client网页代码的网页,静态页面网址中一般不含&q ...

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

    为了提高网站性能.和网站的负载能力,页面静态化是一种有效的方式,这里对于asp.net mvc3 构架下的网站,提供一种个人认为比较好的静态话方式. 实现原理是通过mvc提供的过滤器扩展点实现页面内容 ...

  9. Asp.net Mvc 页面静态化

    http://www.cnblogs.com/gowhy/archive/2013/01/01/2841472.html

随机推荐

  1. Linux常用命令大全3

    linux命令1,关机shutdown -h now2,init 0 关闭系统3,shutdown -h hours:minutes &按预定时间关闭系统4,shutdown -c取消按预定时 ...

  2. linux下vi修改文件用法

    进入vi的命令 vi filename :打开或新建文件,并将光标置于第一行首 vi +n filename :打开文件,并将光标置于第n行首 vi + filename :打开文件,并将光标置于最后 ...

  3. ios operationqueue

    http://www.hrchen.com/2013/06/multi-threading-programming-of-ios-part-2/

  4. SG定理与SG函数

    一个蒟蒻来口胡$SG$函数与$SG$定理. 要是发现有不对之处望指教. 首先我们来了解一下$Nim$游戏. $Nim$游戏是公平组合游戏的一种,意思是当前可行操作仅依赖于当前局势. 而经典$Nim$游 ...

  5. Django中对接第三方支付(支付宝)实现支付的流程

    1. 业务逻辑准备 1. 使用沙箱提供的商家环境 沙箱环境:是支付宝提供给开发者的模拟支付的环境 沙箱应用:https://docs.open.alipay.com/200/105311 沙箱账号:h ...

  6. 年华利率n%

    年化利率12%指的是,在您出借的本金不减少的情况下,您一年后的利息将达到您出借本金的12%.也就是说,如果年化利率是12%,则每月您出借资金获得的利息是1%(12% / 12个月). 在有利网,您的投 ...

  7. Java:post请求

    文章来源:https://www.cnblogs.com/hello-tl/p/9140870.html 0.post请求返回json import java.io.BufferedInputStre ...

  8. Python工程师面试题目

    1.请尽可能列举python列表的成员方法,并给出一下列表操作的答案: len() 返回列表中的元素数量. max() 返回列表中的最大元素.最大元素的判断依据是列表中的对象类型.数字列表中的最大元素 ...

  9. PHP include和require 区别

    require 的使用方法如 require("MyRequireFile.php"); .这个函数通常放在 PHP 程序的最前面,PHP 程序在执行前,就会先读入 require ...

  10. 【转】关于大型网站技术演进的思考(十三)--网站静态化处理—CSI(5)

    讲完了SSI,ESI,下面就要讲讲CSI了 ,CSI是浏览器端的动静整合方案,当我文章发表后有朋友就问我,CSI技术是不是就是通过ajax来加载数据啊,我当时的回答只是说你的理解有点片面,那么到底什么 ...