2017-10-09 67 views
2

我發送的請求可能會非常大(〜1Mb),並且在發出請求時以及處理請求時發生了很大的延遲。我想我可以通過使用gzip將請求壓縮到asp來減少這個時間。使用HttpClient將請求壓縮到asp.net core 2站點的最佳方式是什麼?

下面是我沒有壓縮請求的非常直接的方式。在客戶端請求方實現Gzip請求壓縮的正確方法是什麼,一旦我在客戶端上實現它,我需要爲服務器端做些什麼?

using (HttpResponseMessage response = client.PostAsync("Controller/Action", httpContent).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)); 
    } 
} 

回答

3

所以我把它用在服務器端簡單的中間件並沒有太多的工作就上班客戶端。我使用WebAPIContrib github項目中的CompressedContent.cs,正如Rex在他的回答中提出的建議,並提出瞭如下所示的請求。整個拋出異常,如果不是好的,因爲我正在使用Polly包裹我的請求與重試和等待策略。

客戶端:

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已流請求體流,我敢肯定你需要的應用程序之前,把中間件。 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); 
    } 
} 
1

您可能需要啓用壓縮如下圖所示

var handler = new HttpClientHandler(); 
if (handler.SupportsAutomaticDecompression) 
{ 
    handler.AutomaticDecompression = DecompressionMethods.GZip | DecompressionMethods.Deflate; 
} 

var client = new HttpClient(handler); 

MSDN參考:Using automatic decompression with HttpClient

+1

一個參考MSDN鏈接將是完美的 –

+0

https://blogs.msdn.microsoft.com/dotnet/2013/06/06/portable-compression-and-httpclient-working-together/ – Rex

+0

也許我缺少一些東西,但看起來它只會處理響應解壓縮而不是請求壓縮,對吧? – Theyouthis

相關問題