【问题标题】:GZip response in API method with .NET Core 3.1.NET Core 3.1 API 方法中的 GZip 响应
【发布时间】:2020-10-16 12:54:51
【问题描述】:

我需要在不全局启用 GZip 的情况下对 .NET Core 3.1 中单个 API 方法返回的对象进行 GZip。

我是这样做的:

  [HttpGet]
    public async Task<IActionResult> Get()
    {

        var data =new  Foo();
        string serializedData = JsonConvert.SerializeObject(data);


        var bytes = Encoding.UTF8.GetBytes(serializedData);

        using (var msi = new MemoryStream(bytes))
        using (var mso = new MemoryStream())
        {
            using (var gs = new GZipStream(mso, CompressionMode.Compress))
            {
                msi.CopyTo(gs);
            }

            Response.Headers.Add("Content-Encoding", "gzip");
            return Ok(mso.ToArray());
        }

    }

public class Foo
{
    public string Bar { get; set; }

}

当我使用浏览器测试此方法时,我收到以下错误:

GET http://localhost:5000/test net::ERR_CONTENT_DECODING_FAILED 200 (OK)

浏览器似乎无法解码 GZip 内容。

我想念什么?

【问题讨论】:

  • 目前我们不知道是服务器发送了良好的 GZIP 还是浏览器出现故障。所以我会使用像wireshark或fiddler这样的嗅探器并检查嗅探器是否可以打开GZIP。
  • 我已经更新了代码。现在你可以测试它了。
  • 你为什么要这样做?如果没有 content-disposition 标头,则无法保存。 OK 用于返回被序列化的对象,例如 JSON,这绝对不是内容类型所声称的。您应该使用File() 返回文件内容。如果你想压缩响应,你可以简单地配置 ASP.NET Core 来做到这一点
  • 检查Response compression in ASP.NET Core。但是,如果您将 Web 应用程序部署到 IIS 或 Nginx,它们的响应压缩会更好
  • 由于服务器性能问题,我们无法对所有方法进行 GZip。我们正在尝试将 GZip 限制为返回非常长的文本内容 (5-8 MB) 的单一方法。

标签: c# api .net-core


【解决方案1】:

好的,我不得不尝试一下(我还没有太多使用 .Net Core 的经验)。但最后它很简单::)

[HttpGet]
public void Get()
{
  var data = new Foo();
  data.Bar = new string('a', 100000); // dummy content

  string serializedData = JsonConvert.SerializeObject(data);

  var bytes = Encoding.UTF8.GetBytes(serializedData);

  using (var msi = new MemoryStream(bytes))
  using (var mso = new MemoryStream())
  {
    using (var gs = new GZipStream(mso, CompressionMode.Compress))
    {
      msi.CopyTo(gs);
    }

    Response.Headers.Add("Content-Encoding", "gzip");
    Response.Body.WriteAsync(mso.ToArray());
  }

}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-18
    • 1970-01-01
    • 2020-10-10
    • 2021-05-31
    • 1970-01-01
    • 2022-01-19
    • 2021-07-28
    相关资源
    最近更新 更多