ASP.NET下優化Session的使用

我們知道一個頁面去存取用戶的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>

發佈了35 篇原創文章 · 獲贊 3 · 訪問量 15萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章