除非代碼主動檢查 `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());
}
測試步驟:
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;
}
}
}
HTTP 無狀態、請求-回應模型決定了伺服器無法感知客戶端「關閉」動作。`Response.IsClientConnected` 是唯一可用的偵測手段,但有延遲且不適用於背景執行緒。架構層面應將長耗時作業移出請求管線,才是根本解決之道。