如何压缩通过一个asp.net MVC应用程序发送的输出?
下面是我使用(因为这个时刻的):
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
{...}
还有其他的一些变体,但是这个工作得很好。 (顺便说一句,我用我的BaseController [压缩]属性保存整个项目重复,而上面是做什么用控制器根据控制器上。
[编辑]如上段所述。为了简化使用,还可以包括[Compress]
ONESHOT在BaseController本身,因此,每一个孩子继承控制器默认访问功能:
[Compress]
public class BaseController : Controller
{...}
看看this article其中概述了使用操作过滤器一记漂亮的方法。
例如:
[CompressFilter]
public void Category(string name, int? page)
而作为一个额外的好处,它也包括一个CacheFilter。
对于.NET核心2.1存在能够使用的新的封装(Microsoft.AspNetCore.ResponseCompression)
简单的样品要不断前进,在安装包后:
public class Startup
{
public void ConfigureServices(IServiceCollection services)
{
services.AddResponseCompression();
services.AddResponseCompression(options =>
{
options.Providers.Add<GzipCompressionProvider>();
options.EnableForHttps = true;
});
}
public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
app.UseResponseCompression();
}
}
你可以阅读更多关于它在这里:https://docs.microsoft.com/en-us/aspnet/core/performance/response-compression?view=aspnetcore-2.1&tabs=aspnetcore2x