您的位置:首页 > 编程语言 > ASP

asp.net mvc浏览器缓存和压缩的实现

2010-02-23 09:55 417 查看
cache在开发高可扩展性的web应用中起着至关重要的作用,我们可以按照预定的时间将任何get请求缓存到浏览器中,如果在预定的时间内用户请求同一URL那么response就会通过浏览器的cache来实现而非server。可以通过下面的action filter在ASP.NET MVC应用中实现同样的功能:

using System;

using System.Web;

using System.Web.Mvc;

public class CacheFilterAttribute: ActionFilterAttribute

{

/// <summary>

/// Get 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(FiterExecutedContext filterContext)

{

if (Duration <= 0) return;

HttpCachePolicy cache = fiterContext.HttpContext.Response.Cache;

TimeSpan cacheDuration = TimeSpan.FromSeconds(Duration);

cache.SetCacheability(Httpcacheablity.public);

cache.SetExpires(DateTime.Now.Add(cacheDuration);

cache.SetMaxAge(cacheDuration);

cache.AppendCacheExtension("must revalidate, proxy-revalidate");

}

}

可以在controller action method中应用这个filter:

[CacheFilter(Duration = 60)]

public void Category(string name, int? page)

{

}

提升web 应用性能的另外一个重要因素便是压缩,目前大多数的浏览器都接受压缩过的内容,这样就大大节省了带宽。可以通过下面的filter在ASP.NET WEB应用中压缩你的response:

using System.Web;

using System.Web.Mvc;

public class CompressFilter : ActionFilterAttribute

{

public override 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"))

{

reponse.AppendHeader("Content-encoding","gzip");

response.Filter = new GZipStream(response.Filter,CompressionMode.Compress);

}

}

}

可以在Controller action method中应用这个filter:

[CompressFilter]

public void Category(string name, int? page)

{

}

当然也可以两个filter一块儿使用:

[CompressFilter]

[CacheFilter(Duration = 60,Order = 2)]

public void Category(string name, int? page)

{

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐