我需要將http post請求中的大量數據發送到支持gziped編碼請求的服務器。如何即時壓縮http請求,而不需要在內存中加載壓縮緩衝區
從一個簡單的
public async Task<string> DoPost(HttpContent content)
{
HttpClient client = new HttpClient();
HttpResponseMessage response = await client.PostAsync("http://myUri", content);
response.EnsureSuccessStatusCode();
return await response.Content.ReadAsStringAsync();
}
開始我只是增加了一個預壓縮
public async Task<string> DoPost(HttpContent content, bool compress)
{
if (compress)
content= await CompressAsync(content);
return await DoPost(content);
}
private static async Task<StreamContent> CompressAsync(HttpContent content)
{
MemoryStream ms = new MemoryStream();
using (GZipStream gzipStream = new GZipStream(ms, CompressionMode.Compress, true))
{
await content.CopyToAsync(gzipStream);
await gzipStream.FlushAsync();
}
ms.Position = 0;
StreamContent compressedStreamContent = new StreamContent(ms);
compressedStreamContent.Headers.ContentType = content.Headers.ContentType;
compressedStreamContent.Headers.Add("Content-Encoding", "gzip");
return compressedStreamContent;
}
它完美,但壓縮數據被完全地加載到內存中發送請求之前。 I 希望能夠在流式傳輸過程中實時壓縮數據。
要做到這一點,我已經試過下面的代碼:
private static async Task<HttpContent> CompressAsync2(HttpContent content)
{
PushStreamContent pushStreamContent = new PushStreamContent(async (stream, content2, transport) =>
{
using (GZipStream gzipStream = new GZipStream(stream, CompressionMode.Compress, true))
{
try
{
await content.CopyToAsync(gzipStream);
await gzipStream.FlushAsync();
}
catch (Exception exception)
{
throw;
}
}
});
pushStreamContent.Headers.ContentType = content.Headers.ContentType;
pushStreamContent.Headers.Add("Content-Encoding", "gzip");
return pushStreamContent;
}
但它永遠不會熄滅CopyToAsync(gzipStream)的。 FlushAsync永遠不會執行,也不會引發異常,Fiddler也不會看到任何已啓動的帖子。
我的問題是:
- 爲什麼CompressAsync2不起作用?
- 如何在發送過程中進行壓縮以及是否在內存中加載壓縮緩衝區?
任何幫助將不勝感激。
'PushStreamContent'不支持'async' lambda。 –
@Stephen Cleary:你說得對,我應該檢查一下!我無法從PushStreamContent派生到重載SerializeToStreamAsync(太多內部)。你能看到一個解決方案嗎? – MuiBienCarlota
Humm,只需要[PushStreamContent並修改它](https://aspnetwebstack.codeplex.com/SourceControl/latest#src/System.Net.Http.Formatting/PushStreamContent.cs)來支持'異步'lambda。幾個月前,我一直在我的「待辦事項」名單上,但沒有得到它。 –