ASP.NET C# 不同瀏覽器在 buffer 緩衝區 與Response.Flush() 表現差異比較

ASP 輸出內容到網頁的方式基本上有兩種

  1. 直接輸出
  2. 緩衝區輸出

直接輸出的方式,每次連線 server 都要執行程式

buffer 緩衝區輸出方式,則首次連線會需要執行程式,程式會將結果放一份在緩衝區,後續連線則是直接從緩衝區讀取數據

緩衝區+大量資料

在 ASP 載入頁面時,若遇到需載入大量內容的情況,若使用到緩衝區

server 端開始載入大量資料時,會需要一段時間將資料一筆一筆放入緩衝區,直到所有數據完成之後,才會在前端頁面產出

此時會耗費較久時間,才會將資料呈現在畫面上

緩衝區資料輸出的時間點

輸出緩衝區資料的方式有兩種: Response.End 或者 Response.Flush

Response.Clear 則是可以清除緩衝區的資料(清除後就無法再送到前端)

Response.Clear 通常都會搭配 Flush 一起使用

使用Flush 預先支出緩衝區內容

這時就可以運用 Response.Flush() 解決等待時間過久的問題

在使用 Response.Flush() 時,要先將 Response.BufferOutput 設定為 true,避免再運行過程中會出現問題

Response.Flush() 可以在資料存取到緩衝區的同時間,立即輸出緩衝區的資料,這時server會持續與頁面保持請求連線,當Flush 拋出資料時,就立即反映在頁面

蒐集瀏覽器資料的處理方式,在不同瀏覽器會有不同處理方式

Chrome, Firefox, Edge 在接收到資料後,就會立即進行渲染,當資料是屬於續傳類型,就會在畫面看到一筆一筆資料逐步出現 須特別留意的是,Firefox, Edge 必須要等到資料為256字元才會真正進行flush輸出緩衝資料 Chrome 則可以做到即時

IE11 則是會等待所有資料都蒐集完畢後,才會一次處理

清除緩衝區資料

透過 Response.Clear() 可以刪除緩衝區所有的內容,使用前同樣要先將 Response.BufferOutput 設定為 true,避免再運行過程中會出現問題

測試

關閉 buffer,直接輸出網頁端,資料畫一筆一筆出現

Response.BufferOutput = false;
Response.Flush();
for (int i = 1; i <= 20; i++)
{
    Response.Write("(" + i.ToString() + ")-abcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefg<br/>");//256 以上字元
    System.Threading.Thread.Sleep(400);
}
Response.End();

開啟 buffer,將資料存取在buffer中,等所有程序結束才會輸出瀏覽器

Response.BufferOutput = true;
Response.Flush();
for (int i = 1; i <= 20; i++)
{
    Response.Write("(" + i.ToString() + ")-abcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefg<br/>");//256 以上字元
    System.Threading.Thread.Sleep(400);
}
Response.End();

開啟 buffer 且中途進行 flush 與 clear,資料會一筆一筆出現

Response.BufferOutput = true;
Response.Flush();
for (int i = 1; i <= 20; i++)
{
    Response.Write("("+i.ToString()+ ")-abcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefgabcdefg<br/>");//256 以上字元
    Response.Flush();
	Response.Clear();
    System.Threading.Thread.Sleep(400);
}
Response.End();