だから私はあまりにも多くの仕事を、それは、サーバー側で簡単なミドルウェアで動作するようになったとありませんクライアント側。私はWebAPIContrib githubプロジェクトのCompressedContent.csをRexのコメントで提案し、以下のようにリクエストしました。 OKでない場合はスロー例外が発生します.Plylyを使用してリクエストをリトライして待機ポリシーを適用しているためです。
クライアント側:
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));
}
}
は、その後、私はGzipでストリームとリクエストボディストリームを包んミドルウェアの簡単な作品を作成し、サーバー側では、私はあなたがアプリの前にミドルウェアを配置する必要がありますかなり確信しています。 configure関数でUseMvc()を使用します(私はまだ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);
}
}
MSDNの参照リンクは –
https://blogs.msdn.microsoft.com/dotnet/2013/06/06/portable-compression-and-httpclient-working-together/ – Rex
たぶん私は完璧になります何かが欠けていますが、それは応答の圧縮解除のみを処理し、圧縮は要求しないようです。 – Theyouthis