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
。
那麼,什麼是memoryStream
,compressedStream
和responseStream
之間的關係?我們創建了compressedStream
來寫入responseStream
,然後最終寫入httpContext.Response.Body
,但是從responseStream
到httpContext.Response.Body
的引用不再存在?
如果它那麼簡單,我不會問;)'httpContext.Response.Body'是什麼返回給客戶端;在我正在寫什麼東西的代碼的哪一部分,除了分配沒有任何內容的'responseStream'。 – CodeAddict
這兩條語句: 'var responseStream = httpContext.Response.Body;'和 'new GZipStream(responseStream,CompressionLevel.Optimal)' –
這正是我所迷惑的:|該代碼將'responseStream'初始化爲「指向''httpContext.Response.Body';然而,'httpContext.Response.Body = memoryStream;'部分刪除該引用,現在'httpContext.Response.Body'是別的東西......或者有什麼在.net引用我在這裏失蹤? – CodeAddict