【问题标题】:2 different `Content-Encoding` on 2 different aspnet core webapi `Actions`2个不同的asp net core web api`Actions`上的2个不同的`Content-Encoding`
【发布时间】:2021-03-10 18:01:56
【问题描述】:

我有Controller1/Action1,它目前不关心请求中的Accept-Encoding,并且总是返回application/json 响应。

现在在同一个应用程序中,我们添加了Controller2/Action2,它将返回巨大的 json (~5mb) 并且想要使用压缩并决定使用gzip。我们的new client_2Controller2/Action2 已准备好以gzip 的身份使用它。

虽然Controller1/Action1 仍然必须将Content-Encoding 返回为application/json 而不是gzip,因为我不认为Controller1/Action1 中的所有client_1s 都通过Accept-Encoding 标头。

那么我怎样才能在 2 个不同的 Actions 上实现 2 个不同的 Content-Encoding

在 aspnet 管道中添加以下压缩会为所有操作生成 gzip,并且不会为我想要的 Controller1/Action1 返回 JSON,因为我不认为所有 client_1s 都有能力使用 gzip

        public void ConfigureServices(IServiceCollection services)
        {
            services.AddResponseCompression(options => { options.EnableForHttps = true; });
            services.Configure<GzipCompressionProviderOptions>(options =>
            {
                options.Level = CompressionLevel.Optimal;
            });
        }

仅在 Action 上添加下面的属性似乎也没有任何效果,我没有得到任何回复

[Produces("application/gzip")]

【问题讨论】:

    标签: asp.net-web-api gzip content-encoding


    【解决方案1】:

    如果您使用 GZip 进行压缩,Action Controller2/Action2 总是以二进制格式返回数据。因此,您必须将响应标头中的“内容编码”更改为二进制。 例如,在响应标头中,尝试给出以下内容

    Content-Encoding: gzip
    Vary: Accept Encoding
    

    在请求头中,给出以下内容,

    Accept-Encoding: br, compress, gzip 
    

    还有另一种方法,您可以使用以下代码将压缩的二进制文件转换为字符串,这将被接受 JSON 的客户端接受。

    using (var stream = new MemoryStream())
            {
                using (var zip = new GZipStream(stream, CompressionMode.Compress, true))
                {
                    var formatter = new BinaryFormatter();
                    formatter.Serialize(zip, list);
                }
                var byteArray = stream.ToArray();
                StringBuilder sb = new StringBuilder();
                foreach (byte item in byteArray)
                {
                    sb.Append((char)item);
                }
                return sb.ToString();
            }
    

    【讨论】:

      猜你喜欢
      • 2018-06-11
      • 2023-03-28
      • 2014-12-02
      • 2020-10-05
      • 2019-06-29
      • 2018-07-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多