donc je l'ai eu à travailler avec le middleware simple sur le côté serveur et pas trop de travail sur le côté client. J'ai utilisé le compressedContent.cs du projet WebAPIContrib github, comme Rex l'a suggéré dans les commentaires de sa réponse, et fait la demande comme indiqué ci-dessous. L'exception entière de lancement si pas OK est parce que j'utilise Polly enroulé autour de ma demande avec une politique Retry et wait.
côté client:
using (var httpContent = new StringContent(stringPayload, Encoding.UTF8, "application/json"))
using (var compressedContent = new CompressedContent(httpContent, "gzip"))
using (HttpResponseMessage response = client.PostAsync("Controller/Action", compressedContent).Result)
{
if (response.StatusCode != System.Net.HttpStatusCode.OK)
{
throw new Exception(string.Format("Invalid responsecode for http request response {0}: {1}", response.StatusCode, response.ReasonPhrase));
}
}
Ensuite, sur le côté serveur que je crée un simple morceau de middleware qui enveloppé le flux de corps de la demande avec le flux Gzip, je suis assez sûr que vous avez besoin de mettre le middleware avant application. UseMvc() dans la fonction configure (j'utilise toujours le style de démarrage ASPcore 1).
public class GzipRequestMiddleware
{
private readonly RequestDelegate next;
private const string ContentEncodingHeader = "Content-Encoding";
private const string ContentEncodingGzip = "gzip";
private const string ContentEncodingDeflate = "deflate";
public GzipRequestMiddleware(RequestDelegate next)
{
this.next = next ?? throw new ArgumentNullException(nameof(next));
}
public async Task Invoke(HttpContext context)
{
if (context.Request.Headers.Keys.Contains(ContentEncodingHeader) && (context.Request.Headers[ContentEncodingHeader] == ContentEncodingGzip || context.Request.Headers[ContentEncodingHeader] == ContentEncodingDeflate))
{
var contentEncoding = context.Request.Headers[ContentEncodingHeader];
var decompressor = contentEncoding == ContentEncodingGzip ? (Stream)new GZipStream(context.Request.Body, CompressionMode.Decompress, true) : (Stream)new DeflateStream(context.Request.Body, CompressionMode.Decompress, true);
context.Request.Body = decompressor;
}
await next(context);
}
}
Un lien de référence msdn serait parfait –
https://blogs.msdn.microsoft.com/dotnet/2013/06/06/portable-compression-and-httpclient-working-together/ – Rex
Peut-être que je suis manquant quelque chose mais qui semble ne traiter que la décompression de la réponse et ne pas demander la compression, non? – Theyouthis