【发布时间】: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) 的单一方法。