<noframes id="tvbx3">

    <address id="tvbx3"><menuitem id="tvbx3"><menuitem id="tvbx3"></menuitem></menuitem></address>
          虛擬主機域名注冊-常見問題虛擬主機問題 → 虛擬主機問題


        (asp.net)關于SessionState與序列化的一點教訓
        作者:
        很簡單的東西,因為在學習中遇到了,所以記錄下來.

        事情的起因是,我在做一個購物藍時,將一個自定義的類CartManager整個放進Session中,它的部分代碼如下,其實就是有一個Private的ArrayList成員_cart用來放CartInfo類實例,而CartInfo類又包括一個成員ProductInfo _product和一個double _moneny...并不復雜.但是我都沒有弄任何Serializable的東西,于是...

        本機調試沒問題,放到服務器上卻發現這個購物車表現非常怪異,時好時壞,總覺得好象Session里的東西亂得很,有時能存進去有時存不進?

        比較了本機與服務器的環境,我知道問題肯定與SessionState有關.因為服務器用了Web Farm(并且將最大工作進程數設置成了10).

        一般我們在做一個WEB Application的時候,它的SessionState的Mode=InProc的,可參見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=StateServer了,否則就會造成前面所說的Session中的值不確定的現象.但是,如果簡單地這樣改一下,系統又報錯說對于以StateServer 或者 SqlServer兩種方式保存會話狀態,要求對象是可序列化的(大意如此)...所以我們還需要再將對象做一下可序列化聲明.

        如果要保存的對象很簡單,都是由基本類型組成的,就只需要聲明一下屬性即可,如:

        [Serializable()]
        public class ProductInfo {

        private string f_SysID;


        public string SysID {
        get {
        return this.f_SysID;
        }
        set {
        this.f_SysID = value;
        }
        }

        對于本例中,CartInfo 與 ProductInfo兩個類,可以這樣聲明一下.只是CartManager就稍多幾句話,如下:


        [Serializable]
        public class CartManager : ISerializable
        {
        private ArrayList _cart=new ArrayList();

        public CartManager()
        {
        }

        protected CartManager(SerializationInfo info, StreamingContext context)
        {
        this._cart=(ArrayList)info.Getvalue("_cart",typeof(ArrayList));
        }

        void ISerializable.GetObjectData(SerializationInfo info, StreamingContext context)
        {
        info.Addvalue("_cart",this._cart);
        }

        private CartInfo findCartInfo(string sid)
        {
        foreach(CartInfo ci in this._cart)
        {
        if( ci.Product.SysID.Equals(sid) ) return ci;
        }
        return null;
        }


        public ArrayList getCart()
        {
        return this._cart;
        }


        這樣實現了整個CartManager--CartInfo--ProductInfo的可序列化聲明,于是就一切正常了...


        文章出自:
        http://www.cnblogs.com/sharetop/archive/2005/10/08/250286.html



        來源:
        閱讀:5589
        日期:2007-03-29

        【 雙擊滾屏 】 【 推薦朋友 】 【 收藏 】 【 打印 】 【 關閉 】 【 字體: 】 
        上一篇:常見術語介紹
        下一篇:虛擬主機開啟URLrewrite功能的方法介紹
          >> 相關文章
         
        點擊關閉
        • 售前客服
          王經理
          微信:1766534168
          微信二維碼
        18931655174
        亚洲人成伊人成综合网2020

          <noframes id="tvbx3">

          <address id="tvbx3"><menuitem id="tvbx3"><menuitem id="tvbx3"></menuitem></menuitem></address>