静态化处理,可以大大提高客户的访问浏览速度,提高用户体验,同时也降低了服务器本身的压力。在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. Java应用异常状态监测

    阿里巴巴中间件技术专栏 老板最近分派了一个任务,说线上客户在部署应用的时候发生了系统级别的OOM,触发了OOM Killer杀掉了应用,让我们解决这个问题. 对于这个任务,我从如下几点开始调研.分析与 ...

  2. JavaScript基础对象---Number

    一.创建Number实例对象 /** * new Number(value); * value 被创建对象的数字值 * * Number 对象主要用于: 如果参数无法被转换为数字,则返回 NaN. 在 ...

  3. 第十章:C++标准模板库

    主要内容: 1.泛型程序设计 2.与STL有关的概念和术语 3.STL的容器 4.迭代器 5.STL的算法 6.函数对象 暂时略,内容有点多,而且也很重要!但我看完了,日后补上.

  4. Python的串口

    要使用python中的串口,可以下载pywin32-224-cp36-cp36m-win_amd64.whl去安装或者pip install去安装. 调试下来,有一点很不爽,读取read()数据的ti ...

  5. 【HIHOCODER 1604】股票价格II(堆)

    描述 小Hi最近在关注股票,为了计算股票可能的盈利,他获取了一只股票最近N天的价格A1~AN. 在小Hi的策略中,每天可以在下列三种操作中选取一种: 1.什么也不做: 2.按照当天的价格买进一个单位的 ...

  6. oracle中的权限管理

    connect resource权限 grant connect,resource to user; 执行上面的sql语句后用户包括的权限: CONNECT角色: --是授予最终用户的典型权利,最基本 ...

  7. 【转】玩玩负载均衡---在window与linux下配置nginx

    最近有些时间,开始接触负载均衡方面的东西,从硬件F5再到Citrix Netscalar.不过因为硬件的配置虽然不复杂,但昂贵的价格也让一般用户望而却步(十几万到几十万),所以只能转向nginx,sq ...

  8. Spring使用JdbcTemplate实现对数据库操作

    https://www.cnblogs.com/tuhooo/p/6491913.html https://blog.csdn.net/maodoubi/article/details/4826723 ...

  9. Flask--修改默认的static文件夹的方法

    修改的flask默认的static文件夹只需要在创建Flask实例的时候,把static_folder和static_url_path参数设置为空字符串即可. app = Flask(__name__ ...

  10. Charm Bracelet(01背包)

    Bessie has gone to the mall's jewelry store and spies a charm bracelet. Of course, she'd like to fil ...