ASP.NET 要求執行逾時預設 110 秒 (1 分 50 秒)。長時間作業 (報表、匯入、同步) 需調整逾時,可在機器層級、網站層級、單一頁面三個層面設定,優先序:單頁 > Web.config > Machine.config。
三層級設定對照
| 層級 | 設定檔/屬性 | 範圍 | 優先序 | 適用場景 |
| 機器層級 | Machine.config `` | 該機器所有 ASP.NET 應用程式 | 最低 | 伺服器統一基準、共享主機環境 |
| 網站層級 | Web.config `` | 單一 Web 應用程式 | 中 | 專案預設逾時、大多數情況在此設定 |
| 單一頁面 | `Server.ScriptTimeout = 秒數` | 單一 .aspx 頁面執行個體 | 最高 | 特定長耗時頁面 (匯出、報表、批次處理) |
1. Machine.config (需系統管理員權限)
maxRequestLength="102400"
requestLengthDiskThreshold="8192"
useFullyQualifiedRedirectUrl="false"
minFreeThreads="8"
minLocalRequestFreeThreads="4"
appRequestQueueLimit="5000" />
2. Web.config (專案根目錄)
3. 單一頁面程式碼 (.aspx.cs)
protected void Page_Load(object sender, EventArgs e)
{
// 此頁面允許執行 20 分鐘 (1200 秒)
Server.ScriptTimeout = 1200;
// 或在事件處理中動態調整
if (IsLongRunningOperation)
Server.ScriptTimeout = 1800;
}
關鍵陷阱:debug="true" 會忽略 ScriptTimeout
相關逾時設定補充
| 設定 | 位置 | 預設 | 說明 |
| executionTimeout | httpRuntime | 110s | ASP.NET 管線處理總逾時 |
| ScriptTimeout | Server.ScriptTimeout | 110s | 頁面執行逾時,受 executionTimeout 限制 |
| SqlCommand.CommandTimeout | ADO.NET 程式碼 | 30s | SQL 查詢/執行逾時,獨立於 ASP.NET |
| HttpWebRequest.Timeout | 呼叫外部 API 程式碼 | 100s | 外部 HTTP 呼叫逾時 |
| Session.Timeout | Web.config / 程式碼 | 20min | Session 閒置逾時 |
| FormsAuthentication.Timeout | Web.config | 30min | 驗證票據逾時 |
| App Pool Idle Timeout | IIS 應用程式池進階設定 | 20min | 閒置回收,長作業需設 0 或更長 |
最佳實踐建議
- 預設值調大:Web.config 設 `executionTimeout="300"` (5 分鐘) 覆蓋大多數情況。
- 特例單頁再調大:匯出/報表頁 `Server.ScriptTimeout = 1800` (30 分鐘)。
- 正式環境 debug=false:否則逾時機制失效,長卡住不會拋出例外。
- 長作業異步化:超過 2-3 分鐘作業建議改為背景工作 + 輪詢/通知,避免佔用請求執行緒、觸發 AppPool 回收。
- 設定上傳限制同步調整:`maxRequestLength` (KB) 與 `executionTimeout` 需配合,大檔上傳需同時設大。