zoukankan      html  css  js  c++  java
  • ASP.NET MVC Action Filter 缓存与压缩

    原文地址: ASP.NET MVC Action Filter - Caching and Compression

    下载源码: Source.zip

    关于Action Filter你可以参考我的另外一篇文章: ASP.NET MVC : Action过滤器(Filtering)

    缓存在开发高扩充性WEB程序的时候扮演着很重要的角色.我们可以将HTTP请求在一个定义的时间内缓存在用户的浏览器中,如果用户在定义的时间内请求同一个URL,那么用户的请求将会从用户浏览器的缓存中加载,而不是从服务器.你可以在ASP.NET MVC应用程序中使用下面的Action Filter来实现同样的事情:

    using System;
    using System.Web;
    using System.Web.Mvc;
    
    public class CacheFilterAttribute : ActionFilterAttribute
    {
        /// <summary>
        /// Gets or sets the cache duration in seconds. The default is 10 seconds.
        /// </summary>
        /// <value>The cache duration in seconds.</value>
        public int Duration
        {
            get;
            set;
        }
    
        public CacheFilterAttribute()
        {
            Duration = 10;
        }
    
        public override void OnActionExecuted(FilterExecutedContext filterContext)
        {
            if (Duration <= 0) return;
    
            HttpCachePolicyBase cache = filterContext.HttpContext.Response.Cache;
            TimeSpan cacheDuration = TimeSpan.FromSeconds(Duration);
    
            cache.SetCacheability(HttpCacheability.Public);
            cache.SetExpires(DateTime.Now.Add(cacheDuration));
            cache.SetMaxAge(cacheDuration);
            cache.AppendCacheExtension("must-revalidate, proxy-revalidate");
        }
    }

    你可以好像下面一样在你的Controller Action 方法中使用这个Filter :

    
    
    [CacheFilter(Duration = 60)]
    public void Category(string name, int? page)

    下面是在firebug中当 缓存Filter 没有应用的时候的截图 :

    NoCache

    下面的截图是应用了 Cache Filter 时候的截图 :

    Cache

     

    另外一个很重要的事情就是压缩.现在的浏览器都可以接收压缩后的内容,这可以节省大量的带宽.你可以在你的ASP.NET MVC 程序中应用下面的Action Filter 来压缩你的Response :

    using System.Web;
    using System.Web.Mvc;
    
    public class CompressFilter : ActionFilterAttribute
    {
        public override void OnActionExecuting(FilterExecutingContext filterContext)
        {
            HttpRequestBase request = filterContext.HttpContext.Request;
    
            string acceptEncoding = request.Headers["Accept-Encoding"];
    
            if (string.IsNullOrEmpty(acceptEncoding)) return;
    
            acceptEncoding = acceptEncoding.ToUpperInvariant();
    
            HttpResponseBase response = filterContext.HttpContext.Response;
    
            if (acceptEncoding.Contains("GZIP"))
            {
                response.AppendHeader("Content-encoding", "gzip");
                response.Filter = new GZipStream(response.Filter, CompressionMode.Compress);
            }
            else if (acceptEncoding.Contains("DEFLATE"))
            {
                response.AppendHeader("Content-encoding", "deflate");
                response.Filter = new DeflateStream(response.Filter, CompressionMode.Compress);
            }
        }
    }

    然后将这个Filter应用到你的Controller Action 中 :

    [CompressFilter]
    public void Category(string name, int? page)

    下面是没有应用压缩的时候的截图 :

    Uncompressed

    下面的截图是应用了压缩Filter后的情形 :

    Compressed

    你当然也可以将这两个Filter都应用到同一个Action方法上,就好像下面所示 :

    [CompressFilter(Order = 1)]
    [CacheFilter(Duration = 60, Order = 2)]
    public void Category(string name, int? page)

    下面是截图 :

    Both

    Enjoy!!!

    下载源码: Source.zip

  • 相关阅读:
    centos7 /etc/rc.local需要chmod +x /etc/rc.d/rc.local
    epel源
    yum 源
    socket
    CentOS 7使用systemctl如何补全服务名称
    keepalive脑裂的处理,从节点发现访问的虚拟IP就报警,同时尝试发送内容到主节点服务器关闭keepalive和nginx,或者关机
    nginx的 keepalive_timeout参数是一个请求完成之后还要保持连
    kickstart安装步骤
    kickstart
    因客户机IP与服务器IP不在同一网段导致无盘客户机开机卡tftp,提示:PXE-E11: ARP timeout
  • 原文地址:https://www.cnblogs.com/QLeelulu/p/1127119.html
Copyright © 2011-2022 走看看