Session、Application和Cache的使用會影響系統的效能。
1、Session
如果應用程式中不使用的話,要禁用頁面的工作階段狀態,ASP.NET預設是啟用工作階段狀態,可以在@Page指令中設定EnableSessionState屬性:
顯示行號 複製代碼 ?
-
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="WebForm1.aspx.cs" Inherits="WebApplication1.WebForm1" EnableSessionState="False" %>
Enable屬性對Cache或Application對象沒有影響。該屬性只適用於具體的Web頁面(或繼承該頁面的使用者控制項)。如果把EnableSessionState屬性設定false時,設定或檢索會話變數時,會拋出頁面異常。根據頁面的大小,EnableSessionState為true時,會增加頁面載入的時間,因為ASP.NET需要純利Session對象的狀態管理開銷。
如果ASP.NET頁面要求訪問會話變數但從不操作這些變數,頁面只訪問Session而不設定Session,可以設定EnableSessionState為”ReadOnly” 。
可以通過Web.config檔案設定Session狀態:
顯示行號 複製代碼 ?
-
<configuration> <system.web> <sessionState mode="Off"/> </system.web></configuration>
在ASP.NET中,儲存工作階段狀態資訊的方式有很大的靈活性。預設情況下,ASP.NET使用In-Proc的模式儲存工作階段狀態,也就是用來執行ASP.NET工作者進程(aspnet_wp.exe)的同一個進程內。
儲存工作階段狀態資訊方式二,使用狀態伺服器,在本地Web伺服器上的一個外部狀態伺服器處理序上,或者在一個遠程伺服器的儲存工作階段狀態。狀態芙蓉區器其實是一個aspnet_state.exe的Windows服務,在安裝了.NET的任何機器上都可以使用Windows Services進行管理。要把工作階段狀態模式改為狀態伺服器,對於一個特定的Web,可以編輯Web.config檔案,或者在Machine.Config檔案中把它設為機器上的所有Web的預設模式。
顯示行號 複製代碼 ?
-
<configuration> <system.web> <sessionState mode="StateServer" stateConnectionString="127.0.0.1:42424"/> </system.web></configuration>
狀態伺服器必須啟動ASP.NET State Service服務,伺服器預設使用42424連接埠,該連接埠必須在Web伺服器和狀態伺服器之間必須是開啟的,可以通過修改註冊表修改連接埠值:HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\services\aspnet_state\Parameters\Port。使用狀態伺服器相對於In-Proc的模式有效能的損失,資料必須在跨進程或串連到遠程伺服器進行儲存和檢索,在ASP.NET必須序列化和反序列化資料,並在ASP.NET Web應用程式和狀態服務之間提供跨進程的資料編組。
模式三:SQL Server。該模式把工作階段狀態資訊儲存在一個專為狀態管理建立的SQL Server資料庫中。SQL Server工作階段狀態模式是這三種方法最慢的一種,但它最強壯,幾乎不會使Session丟失。
顯示行號 複製代碼 ?
-
<configuration> <system.web> <sessionState mode="SQLServer" sqlConnectionString="server=.;uid=sa;pwd="/>
-
</system.web></configuration>
Session的生命週期,生命週期在Web.config或Machine.config設定檔中是可配置的,timeout(已分鐘為單位)。
顯示行號 複製代碼 ?
-
<configuration> <system.web> <sessionState timeout=”20”/>
-
</system.web></configuration>
在應用程式最佳化工作階段狀態的生命週期需要對使用性做仔細的分析和推測,要在重新建立儲存在工作階段狀態中的值所需的時間和由於引用實質上是被緩衝的值的效能增益之間尋找平衡。如果想把一個自訂的對象(參考型別)的值儲存到工作階段狀態,ASP.NET在把對象儲存到狀態中檢查它的結構,使用一個最佳化儲存空間的演算法儲存該對象,並確保特定類型處於位元組邊界之內,當恢複這個資訊是,ASP.NET需要建立對象的一份副本以檢查它的結構,然後以相反的順序執行相同的預存程序。