[轉] 利用 ResultFilter 實現 Asp.net Mvc 3 頁面靜態化

來源:互聯網
上載者:User

標籤:style   blog   http   io   color   ar   os   使用   sp   

為了提高網站效能、和網站的負載能力,頁面靜態化是一種有效方式,這裡對於 asp.net mvc3 構架下的網站,提供一種個人認為比較好的靜態話方式。

實現原理是通過 mvc 提供的過濾器擴充點實現頁面內容的文本儲存,直接上代碼:

  1 public class StaticFileWriteFilterAttribute : FilterAttribute, IResultFilter  2     {  3         public void OnResultExecuted(ResultExecutedContext filterContext)  4         {  5   6         }  7   8         public void OnResultExecuting(ResultExecutingContext filterContext)  9         { 10             filterContext.HttpContext.Response.Filter = new StaticFileWriteResponseFilterWrapper(filterContext.HttpContext.Response.Filter, filterContext); 11         } 12  13         class StaticFileWriteResponseFilterWrapper : System.IO.Stream 14         { 15             private System.IO.Stream inner; 16             private ControllerContext context; 17             public StaticFileWriteResponseFilterWrapper(System.IO.Stream s,ControllerContext context) 18             { 19                 this.inner = s; 20                 this.context = context; 21             } 22  23             public override bool CanRead 24             { 25                 get { return inner.CanRead; } 26             } 27  28             public override bool CanSeek 29             { 30                 get { return inner.CanSeek; } 31             } 32  33             public override bool CanWrite 34             { 35                 get { return inner.CanWrite; } 36             } 37  38             public override void Flush() 39             { 40                 inner.Flush(); 41             } 42  43             public override long Length 44             { 45                 get { return inner.Length; } 46             } 47  48             public override long Position 49             { 50                 get 51                 { 52                     return inner.Position; 53                 } 54                 set 55                 { 56                     inner.Position = value; 57                 } 58             } 59  60             public override int Read(byte[] buffer, int offset, int count) 61             { 62                 return inner.Read(buffer, offset, count); 63             } 64  65             public override long Seek(long offset, System.IO.SeekOrigin origin) 66             { 67                 return inner.Seek(offset, origin); 68             } 69  70             public override void SetLength(long value) 71             { 72                 inner.SetLength(value); 73             } 74  75             public override void Write(byte[] buffer, int offset, int count) 76             { 77                 inner.Write(buffer, offset, count); 78                 try 79                 { 80                     string p = context.HttpContext.Server.MapPath(HttpContext.Current.Request.Path); 81  82                     if (Path.HasExtension(p)) 83                     { 84                         string dir = Path.GetDirectoryName(p); 85                         if (!Directory.Exists(dir)) 86                         { 87                             Directory.CreateDirectory(dir); 88                         } 89                         if (File.Exists(p)) 90                         { 91                             File.Delete(p); 92                         } 93                         File.AppendAllText(p, System.Text.Encoding.UTF8.GetString(buffer)); 94                     } 95                 } 96                 catch 97                 {  98                  99                 }100             }101         }102     }
View Code

我們的類 StaticFileWriteFilterAttribute 實現了 IResultFilter,這個介面有兩個方法,OnResultExecuted 和 OnResultExecuting,其中 OnResultExecuting 是在 controller 中的action 代碼執行完畢後,但 viewresult 執行之前(即頁面內容產生之前)執行;OnResultExecuted 方法是在 viewresult 執行之後(即頁面內容產生之後)執行。

我們在頁面產生之前將 StaticFileWriteResponseFilterWrapper 類註冊給 Response 對象的 Filter 屬性,這裡使用封裝類可以在沒有副作用的情況下注入頁面內容靜態化的代碼,對於處理商務邏輯的 action 是透明的。

[轉] 利用 ResultFilter 實現 Asp.net Mvc 3 頁面靜態化

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.