So komprimieren Sie eine http-Anforderung im laufenden Betrieb und ohne den komprimierten Puffer in den Speicher zu laden

Ich muss umfangreiche Daten in einer http-Post-Anfrage an einen Server senden, der gziped-codierte Anfragen unterstützt.

Ausgehend von einem einfachen

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();
}

Ich habe gerade eine Vorkomprimierung hinzugefügt

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;
}

Es funktioniert einwandfrei, aber die komprimierten Daten werden vor dem Senden der Anforderung vollständig in den Speicher geladen. ichmöchte in der Lage sein, Daten während des Sendens im Streaming-Modus zu komprimieren.

Dazu habe ich folgenden Code ausprobiert:

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;
}

aber es geht nie aus CopyToAsync (gzipStream). FlushAsync wird nie ausgeführt und es wird keine Ausnahme geworfen und Fiddler sieht keinen Beitrag gestartet.

Meine Fragen sind:

Warum funktioniert CompressAsync2 nicht?Wie komprimiere ich während des Sendens und ohne komprimierten Puffer in den Speicher zu laden?

Jede Hilfe wäre sehr dankbar.

Antworten auf die Frage(1)

Ihre Antwort auf die Frage