Gziplenmiş kodlanmış istekleri destekleyen bir sunucuya bir http posta isteği için hacimli veri göndermem gerekir.http isteklerini anında ve sıkıştırılmış arabellek belleğe yüklemeden nasıl sıkıştırılır
basit
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();
}
başlayarak Sadece bir ön sıkıştırma
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;
}
ekledik Mükemmel ancak veriler tamamen isteğini göndermeden önce belleğe yüklenir sıkıştırmak çalışır. I , akış halinde gönderim sırasında anında veriyi sıkıştırmak isteyebilir. Bunu yapmak için
, kod aşağıdaki denedim:
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;
}
ama copyToAsync (GZipStream) dışına gitmez. FlushAsync hiçbir zaman yürütülmez ve istisna atılmaz ve Fiddler herhangi bir gönderi başlatmaz.
Sorularım şunlardır:
- CompressAsync2 çalışmıyor neden?
- Bellekte sıkıştırılmış arabellek yükleme ve yükleme sırasında anında nasıl sıkıştırılır?
Herhangi bir yardım çok takdir edilecektir.
'PushStreamContent' (şu anda) 'async' lambda'larını desteklemiyor. –
@Stephen Cleary: Haklısınız, kontrol etmeliydim! Ve SerializeToStreamAsync'i (yalnızca çok fazla dahili) aşırı yüklemek için PushStreamContent'ten türemem. bir çözüm görebiliyor musun? – MuiBienCarlota
Hmm, sadece ['PushStreamContent 'almak ve değiştirmek için] (https://aspnetwebstack.codeplex.com/SourceControl/latest#src/System.Net.Http.Formatting/PushStreamContent.cs) desteklemek için en kolay olabilir async' lambdas. Birkaç aydır "todo" listemdeydi, sadece etrafta dolanmadım. –