ASP.NET C# 不同瀏覽器在 buffer 緩衝區 與Response.Flush() 表現差異比較
ASP 輸出內容到網頁的方式基本上有兩種
- 直接輸出
- 緩衝區輸出
直接輸出的方式,每次連線 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();