首页 新闻 会员 周边 捐助

C# HttpClient发post请求时如何压缩内容

0
悬赏园豆:30 [已解决问题] 解决于 2015-07-17 17:39

在用HttpClient进行post时,想对post的内容进行压缩,请问如何实现?

比如下面的代码:

var response = await httpClient.PostAsync("/", new FormUrlEncodedContent(parameters));

想实现对FormUrlEncodedContent中的内容进行压缩。

dudu的主页 dudu | 高人七级 | 园豆:30939
提问于:2015-07-16 13:55
< >
分享
最佳答案
0

http://stackoverflow.com/questions/16673714/how-to-compress-http-request-on-the-fly-and-without-loading-compressed-buffer-in?answertab=votes#tab-top

采用GZIP压缩内容,缺点就是你服务端的代码还要做相对应的解压处理。

如果POST的数据比较小,没必要进行压缩处理。

收获园豆:20
拉风的拉灯 | 小虾三级 |园豆:585 | 2015-07-16 17:13

参考你提供的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比较大的数据。

dudu | 园豆:30939 (高人七级) | 2015-07-17 09:25

服务端的解压问题也解决了。

针对这个问题,写了篇博客:HttpClient与APS.NET Web API:请求内容的压缩与解压

dudu | 园豆:30939 (高人七级) | 2015-07-17 17:39
其他回答(1)
0

从 FromUrlEncodedContent 读出来压缩后用 ByteArrayContent 请求。

或者继承 HttpContent,增加压缩的逻辑。

收获园豆:10
Launcher | 园豆:45050 (高人七级) | 2015-07-16 14:26
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册