• 在Asp.Net里使用动态缓存文件


      在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');"));
  • 相关阅读:
    hdu4549 M斐波那契数列(矩阵快速幂+费马小定理)
    E. 因数串(EOJ Monthly 2020.7 Sponsored by TuSimple)
    2019春总结作业
    大一下半年学期总结
    ball小游戏
    贪吃蛇
    链接远程仓库
    git自动上传脚本及基本代码
    模板 --游戏
    飞机小游戏
  • 原文地址:https://www.cnblogs.com/faib/p/717710.html
Copyright © 2020-2023  润新知