1. 程式人生 > >asp.net超時問題探討

asp.net超時問題探討

前陣子開發的一個專案程式中,總是存在超時問題,我在iis和web.config中都配置了超時為120分鐘,但是經常是不到40分鐘就超時了,很是煩人卻苦於一直沒有找到比較好的一種方案,後來查詢了許多相關的資料才找到一個可以實施的方案。

這裡主要講述一下web.config關於sessionState節點的配置方案,sessionState有四種模式:off,inProc,StateServer,SqlServer。

1、off模式

從字面上就可以看出這個是關閉模式,如果當前頁面不需要session的值,為了減少伺服器資源,你可以去掉Session的開銷。

<sessionState mode="off">或者頁面上

<%@ Page EnableSessionState="false" %>來關閉Session。

2、inProc模式(預設模式)

它允許“無Cookie”的會話,以及在伺服器之外儲存
會話資料。ASP.NET會話狀態模組在Web.config檔案中像下面這樣配置:

<sessionState mode="InProc" cookieless="false" timeout="20" />

在這個例子中,mode屬性設為InProc(預設值),表明會話狀態要由ASP.NET儲存到記憶體中,而且
不用Cookie來傳遞會話ID。採取這種方式,不管Cookie還是隱藏表單欄位都用不著了。
所以,即使網頁中沒有使用表單,也能加入會話。  但是這種方法,應用程式的狀態將依賴於 ASP.NET程序, 當IIS程序崩潰或者正常重啟時,儲存在
程序中的狀態將丟失。

3、StateServer會話管理mos

將mode屬性設為StateServer,也就是將會話資料儲存到單獨的記憶體緩衝區中,再由單獨一臺機器上執行

的Windows服務來控制這個緩衝區。狀態服務全稱是“ASP.NET State Service ”(aspnet_state.exe),計算機管理-服務 裡面即可看到此服務,啟動該服務j

它由Web.config檔案中的stateConnectionString屬性來配置。該屬性指定了服務所在的伺服器,以及要監

視的埠:
<sessionState mode="StateServer"
    stateConnectionString="tcpip=myserver:42424"
    cookieless="false" timeout="20" />
  
 在這個例子中,狀態服務在一臺名為myserver的機器的42424埠(預設埠)執行。要在伺服器上改變

埠,可編輯HKLM/SYSTEM/CurrentControlSet/Services/aspnet_state登錄檔項中的Port值。
 
顯然,使用狀態服務的優點在於程序隔離,並可在Web farm中共享。 使用這種模式,會話狀態的儲存將不

依賴於iis程序的失敗或者重啟,然而,一旦狀態服務中止,所有會話資料都會丟失。換言之,狀態服務不

像SQL Server那樣能持久儲存資料;它只是將資料儲存在記憶體中。

4  用SQL Server進行會話管理
 
   ASP.NET還允許將會話資料儲存到一個數據庫伺服器中,方法是將mode屬性變成SqlServer。
在這種情況下,ASP.NET嘗試將會話資料儲存到由sqlConnectionString屬性(其中包含資料來源以及登入服

務器所需的安全憑證)指定的SQL Server中。
為了用恰當的資料庫物件來配置SQL erver,管理員還需要建立ASPState資料庫,
方法是執行WinDir/Microsoft.Net/Framework/Version資料夾中的InstallState.sql指令碼(WinDir是服務

器的Windows資料夾,而Version是你使用的.NET框架版本的安裝資料夾)。
要配置SQL伺服器,可以在命令列中執行SQL Server 提供的命令列工具osql.exe

osql -S [ server name] -U [user] -P [password] <InstallSqlState.sql
例如
osql -S (local)/NetSDK -U sa -P "" -i InstallSqlState.sql

  在這裡使用者名稱必須是SQL伺服器上的sa帳號,或者具有同等許可權的其他帳號。有興趣的讀者可以開啟
這個指令碼檔案來了解ASP.NET是如何和SQL Server配合實現狀態管理的。  
   解除安裝這些表和儲存過程,可以使用UninstallSqlState.sql指令碼,使用方法與上面類似。做好必要的資料庫準備工作後,將web.config 檔案中的sessionstate 元素的mode改為"sqlserver"
,並且指定SQL連線字串。具體如下:

 mode="sqlserver"
 sqlConnectionString="data source=127.0.0.1; userid=sa; password="

配置好SQL Server後,應用程式程式碼執行時就和InProc模式沒有什麼區別。但要注意的是,由於資料不儲存在本地記憶體,所以儲存會話狀態的物件需要進行序列化和反序列化,以便通過網路傳給資料庫伺服器,以及從資料庫伺服器傳回。這當然會影響效能。通過在資料庫中儲存會話狀態,可分別針對擴充套件性及可靠性來有效地平衡效能。另外,可以利用SQL Server的叢集,使狀態儲存不依賴於單個的SQL Server, 這樣就可以為應用程式提供極大限度的可靠性。

附:部分資料收集來自於網際網路