The Will Will Web

記載著 Will 在網路世界的學習心得與技術分享

善用 Response.IsClientConnected 避免不必要的資源浪費

你在使用網站時不知道有沒有一種經驗是當你按下某一個連結或一個表單按鈕時,突然發現你按錯了,然後你會立即按下 ESC 鍵或按下瀏覽器的停止按鈕中斷網頁執行?我以前就曾經遇到過好幾次這種狀況,而且有些網頁程式執行時間非常長且非常消耗系統資源,例如:匯出幾十萬筆資料、對大量資料進行彙總運算、從伺服器端執行一個長時間的 Web Service 查詢、…等等,雖然使用者很「直覺」的中斷執行,但是伺服器端的程式卻還是會在背景乖乖的把所有的工作做完才會罷手。

我在開發時期只要遇到這種情況,通常都不太願意等程式執行完,而是直接把 w3wp.exe 給手動砍掉,讓 IIS 自動重新啟動應用程式集區,但是網站上線後可能是客戶自己遇到這種情況,而客戶只會抱怨說為什麼網站變很慢而已,為了提升客戶滿意度,這點小技巧的確可以視情況用在專案上。

Response.IsClientConnected 屬性是一個布林值(bool),用來判斷 Client 端是否已經斷線,所以當你要執行十分消耗資源的程式前都做檢查一下,就可以應付這類惱人但不常��的需求。

if(!Response.IsClientConnected) Response.End();

單純執行 Response.End() 會讓之前已經儲存在緩衝區的內容輸出到瀏覽器,如果連這些內容都不要回應的話,可以再加上 Response.Clear() 清除緩衝區的資料(反正使用者本來就看不到)。

if(!Response.IsClientConnected) {
Response.Clear();
Response.End();
}

如果你不想停止執行程式,而是多處理一些其他工作的話,也可以參考以下範例:

if (Response.IsClientConnected)
{
Server.Transfer("SomeOtherPage.aspx");
}
else
{
DoSomeThing();
Response.End();
}

相關連結