Вот что я использую (по состоянию на это время):
using System.IO.Compression;
public class CompressAttribute : ActionFilterAttribute
{
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
var encodingsAccepted = filterContext.HttpContext.Request.Headers["Accept-Encoding"];
if (string.IsNullOrEmpty(encodingsAccepted)) return;
encodingsAccepted = encodingsAccepted.ToLowerInvariant();
var response = filterContext.HttpContext.Response;
if (encodingsAccepted.Contains("deflate"))
{
response.AppendHeader("Content-encoding", "deflate");
response.Filter = new DeflateStream(response.Filter, CompressionMode.Compress);
}
else if (encodingsAccepted.Contains("gzip"))
{
response.AppendHeader("Content-encoding", "gzip");
response.Filter = new GZipStream(response.Filter, CompressionMode.Compress);
}
}
}
использование в контроллере:
[Compress]
public class BookingController : BaseController
{...}
есть и другие варианты, но это работает довольно хорошо.(Кстати, я использую атрибут [Compress] на BaseController для сохранения дублирования в проекте, в то время как вышеупомянутое делает его на контроллере для каждого контроллера.
[Edit] , как упоминалосьв приведенном выше пункте, чтобы упростить использование, вы также можете включить [Compress]
oneshot в сам BaseController, тем самым каждый унаследованный дочерний контроллер получает доступ к функциональности по умолчанию:
[Compress]
public class BaseController : Controller
{...}