asp.net - 在 ASP.NET Core MVC 的操作级别压缩过滤器

标签 asp.net asp.net-mvc asp.net-core

我正在将 ASP.NET MVC 5 应用程序迁移到 ASP.NET Core 2.1。在“旧”应用程序中,我有一个 Compress 过滤器,它将 Gzip 应用于特定请求的响应。这样我就只能压缩特定的请求,而不是所有的请求。

根据我的理解,ASP.NET Core 有一种使用中间件的不同方法,它只让您有机会对所有请求应用压缩(将其添加到管道中)或根本不应用它。

有没有办法通过创建 ActionFilterAttribute 来实现我想要的?这是我的旧代码:

public class CompressAttribute : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext filterContext)
        {
            var acceptEncoding = filterContext.HttpContext.Request.Headers["Accept-Encoding"];

            if (string.IsNullOrEmpty(acceptEncoding))
                return;

            acceptEncoding = acceptEncoding.ToLower();
            var response = filterContext.HttpContext.Response;
            if (acceptEncoding.Contains("gzip"))
            {
                response.AppendHeader("Content-Encoding", "gzip");
                response.Filter = new GZipStream(response.Filter, CompressionMode.Compress);
            }
            else if (acceptEncoding.Contains("deflate"))
            {
                response.AppendHeader("Content-Encoding", "deflate");
                response.Filter = new DeflateStream(response.Filter, CompressionMode.Compress);
            }
        }
    }

最佳答案

我发现了两种不同的方法来将压缩应用于特定场景:

1) 创建中间件 并在应用压缩之前分析请求。我不喜欢这种方法,因为中间件会为所有请求运行,并且必须检查请求信息,从而影响性能。

2) 修改Web.config文件 (这是我采用的方法)并将压缩应用于某些动态和静态类型。发布 ASP.NET Core 应用程序时,会自动生成 web.config。我们可以编辑 web.config 文件并添加压缩,就像我在以下示例中所做的那样:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <system.webServer>
    <urlCompression doStaticCompression="true" doDynamicCompression="true" />
    <httpCompression>
      <dynamicTypes>
        <clear />
        <add enabled="true" mimeType="text/*" />
        <add enabled="true" mimeType="message/*" />
        <add enabled="true" mimeType="application/x-javascript" />
        <add enabled="true" mimeType="application/javascript" />
        <add enabled="true" mimeType="application/json" />
        <add enabled="false" mimeType="*/*" />
        <add enabled="true" mimeType="application/atom+xml" />
        <add enabled="true" mimeType="application/atom+xml;charset=utf-8" />
      </dynamicTypes>
      <staticTypes>
        <clear />
        <add enabled="true" mimeType="text/*" />
        <add enabled="true" mimeType="message/*" />
        <add enabled="true" mimeType="application/javascript" />
        <add enabled="true" mimeType="application/atom+xml" />
        <add enabled="true" mimeType="application/xaml+xml" />
        <add enabled="false" mimeType="*/*" />
      </staticTypes>
    </httpCompression>
    <handlers>
      <add name="aspNetCore" path="*" verb="*" modules="AspNetCoreModule" resourceType="Unspecified" />
    </handlers>
    <aspNetCore processPath="dotnet" arguments=".\YourApplicationName.dll" stdoutLogEnabled="false" stdoutLogFile="\\?\%home%\LogFiles\stdout" />
  </system.webServer>
</configuration>

关于asp.net - 在 ASP.NET Core MVC 的操作级别压缩过滤器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50918729/

相关文章:

asp.net-mvc - Razor MVC 模型正在丢失保存操作的数据

c# - 使用开放的泛型类型将实现多个接口(interface)的服务注册为单例

asp.net-mvc - 当 asp.net 核心应用程序在 docker 容器中运行时,UseStaticFiles 不起作用

asp.net - asp.net 用户登录信息存放在什么地方

c# - 在布局 View 上填充 ViewBag

c# - 如何在 asp.net 母版页中将页脚保持在底部?

c# - object global 是否为 null?

asp.net-mvc - 使用 ASP.NET MVC 的条件格式

javascript - 在选中同一行中其他单元格的其他复选框时禁用行中 html 表格单元格中的复选框

docker - 是否有人使用 ubuntu 18.04 在 docker 中使用 gRPC 服务器在微服务中部署了 .NET Core