[IIS][ASP.net] 連線逾時,Session Timeout的設定

ASP.net session timeout 

前言

如果ASP.net程式中有使用到Session的話,以下說明如何設定Session timeout逾時時間

(如果可以的話,登入機制建議採用ASP.net Form表單驗證,儲存資料則使用HTML5的localStorage,比較不用煩惱容易遺失Session問題)

實作

在ASP.net網站的Web.config裡加入以下區段,timeout單位為分鐘

<configuration>
    <system.web>
        <sessionState timeout="66" />
    </system.web>
</configuration>

或使用IIS來設定也是同樣效果(從IIS 7之後都會修改到Web.config)↓

從IIS選擇站台後,雙擊兩下「工作階段狀態」

還有工作者處理序的閒置逾時時間也要設定

工作者處理序為以下w3wp.exe(IIS Worker Process),預設閒置20分鐘後,IIS會結束w3wp.exe程序導致Session遺失

所以先看站台(或應用程式)的基本設定>查看使用哪個應用程式集區

再找到該應用程式集區右鍵>「進階設定」

把「閒置逾時」加長時間

或另一辦法,把「閒置逾時動作」改成Suspend,雖然這樣工作者處理序會永久佔用電腦記憶體.....

「閒置逾時」、「閒置逾時動作」兩者挑一個改

 

另外,IIS預設每隔1740分鐘(29小時)就會自動另起新的工作者處理序,結束原本的工作者處理序(就像是對著應用程式集區滑鼠右鍵>回收的動作一樣)

這也會導致Session遺失,建議設定如下,固定時間間隔設0,讓應用程式集區不會定期回收,而是在指定時間(凌晨網站最少使用者上線時間)才做回收動作

會有這樣回收機制,是IIS為了解決網站執行久了,可能發生Memory Leaking問題

以上三項為解決ASP.net網站Session逾時/遺失問題的設定。

補充釐清

如果是透過右方選單「限制」>「連線逾時」或「進階設定」>「連線逾時」

(這兩個選項指的是同樣事情)

此處的「連線逾時」指的是HTTP keep-alive連線逾時,和Session Timeout工作階段逾時兩者是不一樣的事情。