在服务器上,我用自定义消息处理程序强制压缩。处理程序检查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
实现来完成此操作。
答案 0 :(得分:2)
也可以在客户端上使用消息处理程序与HttpClient
一起处理请求/响应。在您的情况下,提供与服务器上发生的相反的过程将是有用的。
这是ASP.NET Web API的美丽对称。
关于客户端消息处理程序的一篇很棒的文章就在这里 - http://byterot.blogspot.ch/2012/06/aspnet-web-api-client-delegating.html
另一个例子可以在Henrik的博客上找到 - 它有点旧(针对测试版),但要点仍然相同:http://blogs.msdn.com/b/henrikn/archive/2012/02/16/extending-httpclient-with-oauth-to-access-twitter.aspx