Action FIlter for MVC to GZIP your reults if not turned on as default in IIS7 or if you use IIS6
using System.Collections.Generic;
using System;
using System.IO;
using System.IO.Compression;
using System.Linq;
using System.Web.Mvc;
namespace MvcHelpers
{
/// <summary>
/// http://www.ietf.org/rfc/rfc2616.txt See section 3.5
/// </summary>
public class CompressAttribute : ActionFilterAttribute
{
Dictionary<string, Func<Stream, Stream>> encodings = new Dictionary<string, Func<Stream, Stream>>(StringComparer.InvariantCultureIgnoreCase)
{
{"gzip", stream => new GZipStream(stream, CompressionMode.Compress)},
{"x-gzip", stream => new GZipStream(stream, CompressionMode.Compress)},
{"deflate", stream => new DeflateStream(stream, CompressionMode.Compress)},
{"x-deflate", stream => new DeflateStream(stream, CompressionMode.Compress)},
};
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
var acceptEncodingRaw = filterContext.HttpContext.Request.Headers["Accept-Encoding"];
if (string.IsNullOrEmpty(acceptEncodingRaw)) return;
var match = (from encoding in acceptEncodingRaw.Split(',')
let encoder = SafeGet(encoding)
where encoder != null
select new {encoding, encoder}).FirstOrDefault();
if (match == null) return;
var response = filterContext.HttpContext.Response;
response.AppendHeader("Content-encoding", match.encoding);
response.Filter = match.encoder(response.Filter);
}
private Func<Stream, Stream> SafeGet(string encoding)
{
Func<Stream, Stream> encoder;
encodings.TryGetValue(encoding, out encoder);
return encoder;
}
}
}
Fork
GZIP your Actions in MVC if not used as standard in IIS7 or only use IIS6 - @johannormen Tuesday 20, 2010 8:33 PM
Fork of GZIP your Actions in MVC if not used as standard in IIS7 or only use IIS6 - Stefan Rusek Monday 25, 2011 12:00 PM
1 Feedback
You must log in before you can give any feedback
You must log in before you can post a comment


703
0




Mark 'actionfilter' tag as 'like'
Mark 'actionfilter' tag as 'ignore'