GZip and Deflate Compression Filter for ASP.Net MVC
Submitted by Anthony Bouch on 2 May, 2009
I’d previously created a compression processor for dynamic content – using this excellent post for QValues by Dave Transom. Also just just discovered this post on creating an action filter for compression by Kazi Manzur Rashid.
So combining the two and we have:
public class CompressFilter : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
HttpRequestBase request = filterContext.HttpContext.Request;
// load encodings from header
QValueList encodings = new QValueList(request.Headers["Accept-Encoding"]);
// get the types we can handle, can be accepted and in the defined client preference
QValue preferred = encodings.FindPreferred("gzip", "deflate", "identity");
// if none of the preferred values were found, but the
// client can accept wildcard encodings, we'll default
// to Gzip.
if (preferred.IsEmpty && encodings.AcceptWildcard && encodings.Find("gzip").IsEmpty)
preferred = new QValue("gzip");
HttpResponseBase response = filterContext.HttpContext.Response;
// handle the preferred encoding
switch (preferred.Name)
{
case "gzip":
response.AppendHeader("Content-encoding", "gzip");
response.Filter = new GZipStream(response.Filter, CompressionMode.Compress);
break;
case "deflate":
response.AppendHeader("Content-encoding", "deflate");
response.Filter = new DeflateStream(response.Filter, CompressionMode.Compress);
break;
case "identity":
break;
default:
break;
}
}
}
Which when applied as below to any action method will enable compression if it’s supported by the browser.
[AcceptVerbs(HttpVerbs.Get)]
[CompressFilter]
public ContentResult SiteMap()
{
return new ContentResult
{
Content = SyndicationHelper.GetAggregateSiteMap(),
ContentType = "application/xml; charset=UTF-8"
};
}
Download here: QValueAndCompressionFilter.zip
Category
Comments
maybe you should priorities...
maybe you should priorities deflate over gzip as gzip is essentially a padded deflate, eg. more bytes for no use
it's wrong. it has no checks...
it's wrong. it has no checks for gzip bugs in browsers, especially for ie6
Thanks for the feedback Andy...
Thanks for the feedback Andy and 'Anon'.
I've tested the compression filter with all the major browser version, Safari, Firefox, Chrome, Opera and Internet Explorer 6 SP2 and above, and they all work fine with GZip or Deflate compressed content. Given the current usage statistics on the Web for browser versions I think it's probable safe at this point to serve compressed content without specific user agent checks. Although of course it depends on the application - and implementers may choose otherwise.
I test all controll by...
I test all controll by CompressFile but it has a rand for zip.becuse if size of controll be small compressfill cannot under from controllsize with gzip
Just wanted to say Thank You
Just wanted to say Thank You
My pleasure :-)
My pleasure :-)
I have integrated this code...
I have integrated this code with my MVC.net application. I can see compressed file for firefox, but could not see reduced size for chrome or IE (7 or 8). Do I need to change any settings? Am I doing something wrong?