zoukankan      html  css  js  c++  java
  • ASP.NET MVC Action Filter Caching and Compression

    Caching plays a major role in developing highly scalable web applications. We can cache any http get request in the user browser for a predefined time, if the user request the same URL in that predefined time the response will be loaded from the browser cache instead of the server. You can archive the same in ASP.NET MVC application with the following 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");
    }
    }

    You can apply the filter in your Controller action method like the following.

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

    The following shows the screen-shot in firebug  when cache filter is not applied:

    and this is the screen-shot when the cache filter is applied:

    Another important thing is compression. Now a days, all modern browsers accept compressed contents and it saves huge bandwidth. You can apply the following action filter to compress your response in your  ASP.NET MVC application:

    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);
    }
    }
    }

    Just decorate your controller action with this filter:

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

    The following shows when compression is not applied:

    and this is the screen-shot when the compress filter is applied:

    You can also apply both these filter in the same action method, like the following:

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

    And this is the screen-shot:


    Enjoy!!!( From:http://weblogs.asp.net/rashid/archive/2008/03/28/asp-net-mvc-action-filter-caching-and-compression.aspx)

  • 相关阅读:
    【iCore1S 双核心板_ARM】例程六:WWDG看门狗实验——复位ARM
    【emWin】例程三十二:窗口对象———Progbar
    【iCore4 双核心板】DEMO V1.0 测试程序发布
    【iCore1S 双核心板_FPGA】例程二:GPIO输入实验——识别按键输入
    【iCore1S 双核心板_ARM】例程五:IWDG看门狗实验——复位ARM
    【emWin】例程三十一:窗口对象——Multipage
    【iCore1S 双核心板_ARM】例程四:USART通信实验——通过命令控制LED
    【iCore1S 双核心板_FPGA】例程一:GPIO输出实验——点亮LED
    【iCore1S 双核心板_ARM】例程三:EXTI中断输入实验——读取ARM按键状态
    【emWin】例程三十:窗口对象——Multiedit
  • 原文地址:https://www.cnblogs.com/guanjie20/p/1775869.html
Copyright © 2011-2022 走看看