解說ASP.NET中的session存儲模式運用_.Net教程

      編輯Tag賺U幣
      教程Tag:暫無Tag,歡迎添加,賺取U幣!

      推薦:解讀.Net的精髓——XML和SOAP
      Internet 的應用正在不斷地擴大,但我們的 Internet 編程方式還處于石器時代。Internet 用戶就像老式主機的分時終端上的用戶一樣,他們從一個受保護的資源請求信息,然后等待回應。你從正在瀏覽的 Internet 站點上接收的信息由它希望提供給你的、基于HTML 的

      在asp.net中的Session存儲方式不象asp那樣單一,一共提供了三種存儲方式,由于最近一個2000多人使用的web軟件出現(xiàn)了故障,用戶每天早上在某一時刻出現(xiàn)難以登陸現(xiàn)象,接著Session丟值出現(xiàn),只有重啟IIS,或機器.這時程序恢復正常了.整天都不會出現(xiàn)同樣的問題 ,但是第二天依舊!這種現(xiàn)象持續(xù)了好幾天,我檢查了一下日志文件,高峰每秒訪問人數(shù)大概20人左右,同時大概100多人在線,以后訪問人數(shù)還會增加,為了解決這個怪問題,先從軟件著手,故而三種方式都應用了一番。

      打開web.config文件
      < sessionState

      mode="InProc"

      stateConnectionString="tcpip=127.0.0.1:42424"

      sqlConnectionString="data source=127.0.0.1;Trusted_Connection=yes"

      cookieless="false"

      timeout="20"

      />

      其中默認的mode是InProc類型,這種模式和以前ASP模式一樣,就是服務器將Session信息存儲在IIS進程當中,當IIS關閉、重起后這些進程信息都會丟失,但這種模式的性能最高(具體沒測,看書上說),這種模式是asp.net的默認方式。

      由于這種模式出現(xiàn)了故障,當時我的考慮就是由于訪問量過大的原因,導致Inetinfo.exe進程崩潰。用戶難以登陸以致Session丟值出現(xiàn)故障,我采用了另外一種Session的存儲方式把Session信息存儲在進程外。

      首先,打開管理工具找到服務,找到名為:asp.net State Service的服務,啟動它.并且改成自動啟動。這時你可以在任務管理器中看到一個名為aspnet_state.exe的進程。這就是我們保存session信息的進程。

      然后,回到web.config文件中把Mode的值改為StateServer,保存文件。OK.

      < sessionState

      mode="StateServer"

      stateConnectionString="tcpip=127.0.0.1:42424"

      sqlConnectionString="data source=192.10.78.76;User id=sa;password=sa"

      cookieless="false"

      timeout="20"

      />

      這種模式當我們重起IIS,保存的session值不會丟失。另外這種方式還可以把信息保存在其他機器的進程中,不過還要更改 stateConnectionString="tcpip=127.0.0.1:42424",IP地址改為其他機器即可。

      另外還采取了其他的措施.比如把數(shù)據(jù)庫和Web服務器分開,數(shù)據(jù)庫服務器不提供WEB服務,Web服務器不提供數(shù)據(jù)庫服務,

      然后把連接池擴大,由于asp.net中ADO.NET數(shù)據(jù)訪問默認連接池數(shù)量為100, 后來我擴大到6000順便把寫法加上來

      “Server=(local);

      Database=rgs;

      password=sa;

      user ID=sa;

      Max Pool Size =6000;

      Min Pool Size =5;

      Pooling=True”


      最后把Machine.config中的ProcessModel中的memoryLimit改為95,默認為60,表示內(nèi)存占用超過60%后iis進程會自動重起。接著還做寫其它一些優(yōu)化IIS的方法,把注冊表的IIS緩存加大等等 。

      當我做完這些優(yōu)化步驟后,整個軟件運行比較良好,第二天沒有發(fā)現(xiàn)堵塞的現(xiàn)象,但是第三天情況又出現(xiàn)了,實在沒辦法,我采取了最后一種ASP.NET中的session存儲方法就是將Session存儲在SQLServer中,我想這樣穩(wěn)定性應該強些。

      要使用SQLServer中,首先在會話狀態(tài)的SQLServer的計算機上,運行InstallSqlState.sql或InstallPersistSqlState.sql(默認位置:systemroot\Microsoft.NET\Framework\versionNumber下面)兩個腳本都創(chuàng)建一個名為ASPState的數(shù)據(jù)庫,兩個腳本的差別在于放置ASPStateTempApplication和ASPStageTempSessions表的位置。InstallSqlState.sql腳本將這些表添加到TempDB數(shù)據(jù)庫,該數(shù)據(jù)庫在計算機重起時將丟失數(shù)據(jù),而InstallPersistSqlState.sql腳本將這些表添加到ASPState數(shù)據(jù)庫,該數(shù)據(jù)庫重啟時保留會話數(shù)據(jù)。

      然后在應用程序的web.config文件中,把< sessionState>元素的mode屬性設置為SQLServer,最后將sqlConnectionString屬性設置為Integrated Security=SSPI;data source=serverName;

      < sessionState mode="SQLServer" sqlConnectionString=" Integrated Security=SSPI;

      data source=dataserver;"

      cookieless="false"

      timeout="20"/>

      < /sessionState>


      如果部署在其他機器上可以更改為,加上用戶名和密碼


      < sessionState

      mode="SQLServer"

      stateConnectionString="tcpip=127.0.0.1:42424"

      sqlConnectionString="data source=192.10.78.76;User id=sa;password=sa"

      cookieless="false"

      timeout="20"

      />

      這樣部署完成了,如果不想使用這種可以刪除掉,只要在相應的目錄(systemroot\Microsoft.NET\Framework\versionNumber)找到UninstallPersistSqlState.sql或者UninstallSqlState.sql文件運行即可。這樣就介紹了ASP.NET中的session存儲模式。

      最后要注意的是,無論使用StateServer或者SQLServer模式時,當使用session轉(zhuǎn)換對象時,注意對象要先序列化,就是在類前加上Serializable,否則會出現(xiàn)錯誤!

       

      分享:關于.NET 4.0改進的介紹
      .NET 4.0改進的介紹 核心服務 大部分的新特性都是圍繞自定義和擴展來的,原先不能自定義的東西現(xiàn)在可以自定義了,可以自己擴展了,然后把自己的組件在web.config中配置即可應用我們自己的組件。 Web.Config精簡 .NET框架4.0中會把大部分配置放到machine.conf

      來源:模板無憂//所屬分類:.Net教程/更新時間:2009-10-02
      相關.Net教程