【问题标题】:how to gzip content in asp.net MVC?如何在 asp.net MVC 中压缩内容?
【发布时间】:2011-04-17 15:45:54
【问题描述】:

如何压缩asp.net mvc应用程序发送的输出??

【问题讨论】:

标签: asp.net-mvc asp.net-mvc-2 gzip


【解决方案1】:

查看this article,它概述了一种利用动作过滤器的绝妙方法。

例如:

[CompressFilter]
public void Category(string name, int? page)

此外,它还包括一个 CacheFilter。

【讨论】:

  • okie,测试一下,我还想知道一件事,我如何检查从服务器获取的数据是否被压缩??
  • 按照文章中的方式使用 Firebug 并查看响应头
  • 不适用于 MVC5、IIS 8.5 和 .Net 4.5,我们将不胜感激。
【解决方案2】:

这是我使用的(截至目前):

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] 属性来保存整个项目的重复项,而上面是在一个控制器一个控制器的基础上进行的。

[编辑] 如上段所述。为了简化使用,您还可以在 BaseController 本身中包含 [Compress] oneshot,这样,每个继承的子控制器都默认访问该功能:

[Compress]
public class BaseController : Controller
{...}

【讨论】:

  • 实际上,查看了您的示例-确实非常相似-令人毛骨悚然:)。我已经使用这个代码一年多了,所以可以验证它工作得很好......
  • 我将它添加为全局过滤器,在我的启动类中我添加了GlobalFilter.Filters.Add(new CompressionAttribute());,它的工作原理是#1!还反转了if 子句,以确保在支持两种编码时使用gzip 而不是deflate
  • 只是想补充一点,如果您不是从基本控制器派生的,请不要害怕。您始终可以使用可以处理该问题的 IoC 容器。例如,在 Ninject (MVC 5) 中,您可以使用:“kernel.BindFilter(FilterScope.Controller, 0);”在“RegisterServices(IKernel kernel)”方法下!
  • 很好的答案。但是为什么你把 deflate 选项放在第一位,我改变了顺序,所以 gzip 是第一位的,现在多压缩 10% 左右
  • 重要!在将其放入流之前,您应该检查 response.Filter 是否为空!我遇到了问题,本地一切正常,但部署到 Azure 服务时失败。
【解决方案3】:

对于 .NET Core 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

【讨论】:

    猜你喜欢
    • 2011-06-24
    • 1970-01-01
    • 1970-01-01
    • 2023-03-14
    • 2021-07-28
    • 1970-01-01
    • 1970-01-01
    • 2011-02-26
    相关资源
    最近更新 更多