在用HttpClient进行post时,想对post的内容进行压缩,请问如何实现?
比如下面的代码:
var response = await httpClient.PostAsync("/", new FormUrlEncodedContent(parameters));
想实现对FormUrlEncodedContent中的内容进行压缩。
采用GZIP压缩内容,缺点就是你服务端的代码还要做相对应的解压处理。
如果POST的数据比较小,没必要进行压缩处理。
参考你提供的github中的CompressedContent.cs代码,我实现了一下CompressedContent:
public enum CompressionMethod { GZip = 1, Deflate = 2 } public class CompressedContent : HttpContent { private readonly HttpContent _originalContent; private readonly CompressionMethod _compressionMethod; public CompressedContent(HttpContent content, CompressionMethod compressionMethod) { if (content == null) { throw new ArgumentNullException("content"); } _originalContent = content; _compressionMethod = compressionMethod; foreach (KeyValuePair<string, IEnumerable<string>> header in _originalContent.Headers) { Headers.TryAddWithoutValidation(header.Key, header.Value); } Headers.ContentEncoding.Add(_compressionMethod.ToString().ToLowerInvariant()); } protected override bool TryComputeLength(out long length) { length = -1; return false; } protected async override Task SerializeToStreamAsync(Stream stream, TransportContext context) { if (_compressionMethod == CompressionMethod.GZip) { using (var gzipStream = new GZipStream(stream, CompressionMode.Compress, leaveOpen: true)) { await _originalContent.CopyToAsync(gzipStream); } } else if (_compressionMethod == CompressionMethod.Deflate) { using (var deflateStream = new DeflateStream(stream, CompressionMode.Compress, leaveOpen: true)) { await _originalContent.CopyToAsync(deflateStream); } } } }
用IIS测试了一下,IIS的确不会对请求中的压缩内容自动进行解压。
有这样的压缩需求,正是因为实际应用场景需要post比较大的数据。
服务端的解压问题也解决了。
针对这个问题,写了篇博客:HttpClient与APS.NET Web API:请求内容的压缩与解压
从 FromUrlEncodedContent 读出来压缩后用 ByteArrayContent 请求。
或者继承 HttpContent,增加压缩的逻辑。