在Asp.Net里,可以使用CacheDependency可以在程序里自动的创建一个缓存文件,比如验证码控件中,图片文件就是动态的添加的。
建立缓存文件信息的类:
1
public
class
FileCacheInfo
2 { 3 private string m_FileName; 4 private string m_ContentType; 5 private object m_Content; 6 private DateTime m_DateEntered = DateTime.Now; 7 8 //文件名 9 public string FileName 10 { 11 get{return m_FileName;} 12 set{m_FileName = value;} 13 } 14 15 //文件类型,如js为javascript/text 16 public string ContentType 17 { 18 get{return m_ContentType;} 19 set{m_ContentType = value;} 20 } 21 22 //文件内容 23 public object Content 24 { 25 get{return m_Content;} 26 set{m_Content = value;} 27 } 28 29 //缓存写入日期 30 public DateTime DateEntered 31 { 32 get{return m_DateEntered;} 33 set{m_DateEntered = value;} 34 } 35 36 public FileCacheInfo() 37 { 38 } 39 40 public FileCacheInfo(string FileName, string ContentType, object Content) 41 { 42 this.FileName = FileName; 43 this.ContentType = ContentType; 44 this.Content = Content; 45 } 46 } 建立实现IHttpHandler的类:
1
public
class
FileCacheHandler : IHttpHandler
2 { 3 //注册一个文件到缓存中 4 public static void RegisterFileCache(FileCacheInfo FileInfo) 5 { 6 FileCacheInfo ci = new FileCacheInfo(FileInfo.FileName, FileInfo.ContentType, FileInfo.Content); 7 string FilePath = System.Web.HttpContext.Current.Server.MapPath(FileInfo.FileName); 8 CacheDependency cd = new CacheDependency(FilePath); 9 System.Web.HttpContext.Current.Cache.Insert(FilePath, ci, cd); 10 } 11 12 public void ProcessRequest(HttpContext Context) 13 { 14 string absFilePath = Context.Request.PhysicalPath; 15 16 if(absFilePath.IndexOf("~\\") > -1) 17 { 18 absFilePath = absFilePath.Replace("~", "").Replace("\\\\", "\\"); 19 } 20 21 FileCacheInfo ci = (FileCacheInfo)Context.Cache[absFilePath]; 22 if(ci != null) 23 { 24 if(Context.Request.Headers["If-Modified-Since"] != null) 25 { 26 try 27 { 28 DateTime date = DateTime.Parse(Context.Request.Headers["If-Modified-Since"]); 29 30 if(ci.DateEntered.ToString() == date.ToString()) 31 { 32 Context.Response.StatusCode = 304; 33 Context.Response.StatusDescription = "Not Modified"; 34 Context.Response.End(); 35 return; 36 } 37 } 38 catch(Exception){} 39 } 40 else 41 { 42 Context.Response.AddHeader("If-Modified-Since", ci.DateEntered.ToString()); 43 } 44 } 45 else 46 { 47 ci = UpdateFileCache(Context, absFilePath); 48 } 49 50 Context.Response.Cache.SetLastModified(ci.DateEntered); 51 Context.Response.ContentType = ci.ContentType; 52 if(ci.Content.GetType().Name == "Byte[]") 53 { 54 Context.Response.BinaryWrite((byte[])ci.Content); 55 } 56 else 57 { 58 Context.Response.Write(ci.Content); 59 } 60 Context.Response.End(); 61 } 62 63 public bool IsReusable 64 { 65 get{return true;} 66 } 67 68 private static FileCacheInfo UpdateFileCache(HttpContext Context, string FilePath) 69 { 70 FileCacheInfo ci = new FileCacheInfo(FilePath, "", null); 71 CacheDependency cd = new CacheDependency(FilePath); 72 Context.Cache.Insert(FilePath, ci, cd); 73 return ci; 74 } 75 } 在web.config中配置<httpHandlers>节:
<
httpHandlers
>
< add verb ="POST,GET" path ="*.fbs.ashx" type ="FaibClass.Common.Web.FileCacheHandler, FaibClass.Common" /> </ httpHandlers > 在页面的Page_Load中注册一个缓存文件,写入文件内容,这样在页面端就可以使用<script src=a.fbs.ashx></script>了:
FileCacheHandler.RegisterFileCache(
new
FileCacheInfo(
"
a.fbs.ashx
"
,
"
javascript/text
"
,
"
alert('faib studio');
"
));
|
转载于:https://www.cnblogs.com/mrray/archive/2011/11/29/2267885.html