首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> .NET 網頁程式設計 >> ASP.NET 基礎 >> 關於ASP.NET

ASP.NET 頁面關閉後伺服器端代碼是否繼續執行?驗證與應對策略

     編輯:關於ASP.NET

核心結論

除非代碼主動檢查 `Response.IsClientConnected` 並提前返回,否則伺服器端代碼會繼續完整執行。 瀏覽器關閉/導航離開不會發送任何信號給伺服器中斷執行緒。

驗證實驗

protected void Page_Load(object sender, EventArgs e)
{
 StringBuilder log = new StringBuilder();
 log.AppendLine($"Start: {DateTime.Now:u}");
 Response.Write($"Start: {DateTime.Now:u}
"); Response.Flush(); // 模擬長時間作業 (50 秒) System.Threading.Thread.Sleep(50000); log.AppendLine($"End: {DateTime.Now:u}"); Response.Write($"End: {DateTime.Now:u}
"); // 寫入檔案確認是否執行到此 string dir = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "logs"); Directory.CreateDirectory(dir); string file = Path.Combine(dir, $"exec_{DateTime.Now:yyyyMMdd}.log"); File.AppendAllText(file, log.ToString()); }

測試步驟:

  1. 瀏覽該頁面。
  2. 頁面載入中 (50 秒內) 關閉瀏覽器分頁/視窗。
  3. 檢查 `logs` 目錄下是否產生檔案且包含 "End" 行。
  4. 結果:檔案存在且完整寫入,證明代碼繼續執行。

應對策略:檢查 IsClientConnected

protected void Page_Load(object sender, EventArgs e)
{
 for (int i = 0; i < 100; i++)
 {
 if (Response.IsClientConnected)
 {
 Response.Write($"Step {i}: {DateTime.Now:u}
"); Response.Flush(); System.Threading.Thread.Sleep(500); } else { // 客戶端已斷開,記錄日誌並提前結束 LogWarning($"Client disconnected at step {i}"); Response.End(); // 或 return; break; } } }

重要限制

  • Visual Studio 開發伺服器 (Cassini/IIS Express) 永遠回傳 `true`,無法在本機除錯驗證,必須部署至真實 IIS 測試。
  • `IsClientConnected` 檢查有延遲:瀏覽器關閉後,伺服器需嘗試發送資料 (Flush) 才能偵測到 TCP 連線斷開。
  • 非同步作業 (`async/await`、`Task.Run`、背景佇列) 脫離請求管線,**不受 `IsClientConnected` 影響**,需自行傳遞 `CancellationToken`。

最佳實踐建議

  1. 長時間作業**務必**移至背景工作 (Hangfire、Quartz、Hosted Service、Azure Functions),頁面僅啟動並回傳任務 ID,前端輪詢進度。
  2. 若必須在請求中處理,定期檢查 `Response.IsClientConnected` 並 `Response.End()`。
  3. 使用 `CancellationToken` 傳遞至資料庫查詢 (`command.ExecuteReaderAsync(token)`)、HTTP 呼叫 (`HttpClient`)、檔案 I/O,實現真正的取消傳播。
  4. 記錄「使用者中斷」日誌,區分正常完成與中斷,利於審計與效能分析。

總結

HTTP 無狀態、請求-回應模型決定了伺服器無法感知客戶端「關閉」動作。`Response.IsClientConnected` 是唯一可用的偵測手段,但有延遲且不適用於背景執行緒。架構層面應將長耗時作業移出請求管線,才是根本解決之道。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved