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