2016-02-26 27 views
1

我認爲自己在C#還不錯,但我面對的麻煩在理解下面的代碼:我聽不太懂一個GZipStream ASP.Net核心中間件

using (var memoryStream = new MemoryStream()) 
{ 
    var responseStream = httpContext.Response.Body; 
    httpContext.Response.Body = memoryStream; 

    await this.next(httpContext); 

    using (var compressedStream = new GZipStream(responseStream, CompressionLevel.Optimal)) 
    { 
     httpContext.Response.Headers.Add("Content-Encoding", new [] { "gzip" }); 
     memoryStream.Seek(0, SeekOrigin.Begin); 
     await memoryStream.CopyToAsync(compressedStream); 
    } 
} 

此代碼是從ASP提取。淨核心中間件,壓縮HTTP響應,「出人意料地」,它的工作......或似乎(我用小提琴測試)。

讓我先把我的理解:

  • 的代碼與responseStream抽空httpContext.Response.Body參考啓動。
  • 然後它用新初始化的memoryStream代替httpContext.Response.Body參考。
  • 如果我瞭解C#引用的工作原理,我說我們仍然有一個responseStream的原始httpContext.Response.Body數據的引用,而httpContext.Response.Body新數據爲空。
  • 接下來,我們正在調用管道中的下一個中間件。
  • 因爲this.next()是等待的,我們的代碼執行將「停止」,直到所有中間件返回。
  • 當我們的代碼執行「恢復」時,它將初始化一個GZipStream,添加一個響應標題,然後「尋找」到memoryStream的開頭。
  • 最後,它將內容或memoryStream複製到compressedStream,將其寫入responseStream

那麼,什麼是memoryStreamcompressedStreamresponseStream之間的關係?我們創建了compressedStream來寫入responseStream,然後最終寫入httpContext.Response.Body,但是從responseStreamhttpContext.Response.Body的引用不再存在?

回答

1

該代碼只需將下一個中間件寫入memoryStream對象,並壓縮該對象,以便在運行中間件之前用responseStream中的任何內容響應客戶端。

如此存在responseStream內容+ memoryStream內容。

+0

如果它那麼簡單,我不會問;)'httpContext.Response.Body'是什麼返回給客戶端;在我正在寫什麼東西的代碼的哪一部分,除了分配沒有任何內容的'responseStream'。 – CodeAddict

+0

這兩條語句: 'var responseStream = httpContext.Response.Body;'和 'new GZipStream(responseStream,CompressionLevel.Optimal)' –

+0

這正是我所迷惑的:|該代碼將'responseStream'初始化爲「指向''httpContext.Response.Body';然而,'httpContext.Response.Body = memoryStream;'部分刪除該引用,現在'httpContext.Response.Body'是別的東西......或者有什麼在.net引用我在這裏失蹤? – CodeAddict