【发布时间】:2012-09-11 19:37:22
【问题描述】:
在服务器上,我使用自定义消息处理程序强制压缩。处理程序检查Accept-Encoding 标头,如果支持(例如GZip),则将HttpResponseMessage.Content 替换为CompressedContent 的实例。这只是像这样压缩原始内容:
protected override async Task SerializeToStreamAsync(Stream stream, TransportContext context)
{
Ensure.Argument.NotNull(stream, "stream");
using (content) // original content
{
// creates a new GZip/Deflate stream
var compressed = GetStream(CompressionMode.Compress, stream);
await content.CopyToAsync(compressed);
compressed.Dispose();
}
}
在客户端,我们可以通过检查Content-Encoding标头并使用另一个HttpContent类型进行解压来实现解压:
protected async override Task SerializeToStreamAsync(Stream stream, TransportContext context)
{
Ensure.Argument.NotNull(stream, "stream");
using (content)
{
var compressed = await content.ReadAsStreamAsync();
var decompressed = GetStream(CompressionMode.Decompress, compressed);
await decompressed.CopyToAsync(stream);
decompressed.Dispose();
}
}
我不确定的部分是我们是否应该使用自定义HttpContent 类型来进行解压。在服务器上这样做是有意义的,因为我们真的没有其他方式来接触响应流。然而,在客户端,这可以通过直接解压缩标准 StreamContent 或使用自定义 HttpClient 实现来完成。
【问题讨论】:
-
我接受了 Filip 关于在客户端使用处理程序的建议,并在 ben.onfabrik.com/posts/aspnet-web-api-compression 上写了一篇博客。
标签: asp.net-web-api dotnet-httpclient