我們知道一個頁面去存取用戶的Session是非常耗費性能的,任何一篇asp.net performance方面的文檔都會對asp.net的Session使用作重要說明,我這裏總結一下:
主要分三個方面:
一.儘量避免使用Session
有三種方法:
1)不需要Session的頁面,在頁面聲明部分指出EnableSessionState=false;
2)如果你的某個頁面只是讀Session,可以在頁面頭部聲明EnableSessionState=Readonly
3)如果你整個站點絕大多數頁面都不用Session,可以使用在Web.config裏配置<page enableSessionState=false />,這樣整個站點就不會在使用Session了,如果有個別頁面需要Session,再在需要的頁面加上EnableSessionState=true
另外還有一個小技巧,大家有沒有注意到baidu.com的貼吧,如果你只是瀏覽帖子的話,你是看不到驗證嗎的,這裏除了要節省生成驗證碼的開銷外,還節省了Session的讀寫開銷
二、使用加密Cookie來也作爲Session用
我們在使用asp.net Form認證的時候,要在用戶瀏覽器裏種下一個加密的Ticket, 這個Ticket就是一個加密的Cookie.
當然要使用加密Cookie,你需要在Web.config或者Machine.config裏配置MachineKey和加密密鑰,關於MachineKey方面的文章很多,這裏就不羅嗦了。
另外,使用cookie做認證的時候有兩點需要注意:
1)要求高安全性的網站,如交易網站。最好不要在Cookie裏保存敏感信息,以免密碼泄露造成現在的風險。
2)加密的Ticket的Cookie的數量有些大,要注意控制,不要放太多的數據在Cookie裏。
三、更加精細的控制Session的使用,使你站點的Session使用最經濟
在不需要Session的地方,Disable SessionId, 如:我們瀏覽(get方式)一個帖子,這個時候不需要Session,只要在發表回覆的時候才需要Session,但有時候這是同一個頁面,無法用上面的頁面聲明的方式來達到這個目的了,這個時候我們就可以採取一個比較詭異的方式,來迫使asp.net HttpSessionStateModule不去讀寫Session
如下實現:
public class SessionDisablementIDManager : SessionIDManager
{
// 重寫Session ID manager的ID管理行爲
public override String GetSessionID(HttpContext context)
{
//噹噹前的頁面請求不需要Session狀態的時候,我們不要返回SessionId,
//SessoinID都沒有了,你說SessionStateModule會怎麼做?哈哈!
if (ShouldSkipSessionState(context))
return null;
// 否則,調用asp.net內建的Session ID生成器來生成當前請求的SessionID,asp.net真是月來越靈活了!
else
return base.GetSessionID(context);
}
protected virtual bool ShouldSkipSessionState(HttpContext context)
{
// 決定當前請求使用要跳過Session State
}
}
最後配置一下web.cofnig
<configuration>
<system.web>
<sessionState
sessionIDManagerType="MySessionState. SessionDisablementIDManager"/>
</system.web>
</configuration>