<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    計算機學習積累

    ----轉載有理,轉載是想研究,想研究才會看,看了才會有感想,轉載后我有時會寫一些自己的感受
    數據加載中……

    asp.net session丟失 --轉

    Asp.net 默認配置下,Session莫名丟失的原因及解決辦法
    正常操作情況下Session會無故丟失。因為程序是在不停的被操作,排除Session超時的可能。另外,Session超時時間被設定成60分鐘,不會這么快就超時的。

    這次到CSDN上搜了一下帖子,發現好多人在討論這個問題,然后我又google了一下,發現微軟網站上也有類似的內容。

    現在我就把原因和解決辦法寫出來。


    原因:
    由于Asp.net程序是默認配置,所以Web.Config文件中關于Session的設定如下:
    <sessionState mode='InProc' stateConnectionString='tcpip=127.0.0.1:42424' sqlConnectionString='data source=127.0.0.1;Trusted_Connection=yes' cookieless='true' timeout='60'/>

    我們會發現sessionState標簽中有個屬性mode,它可以有3種取值:InProc、StateServer?SQLServer(大小寫敏感) 。默認情況下是InProc,也就是將Session保存在進程內(IIS5是aspnet_wp.exe,而IIS6是W3wp.exe),這個進程不穩定,在某些事件發生時,進程會重起,所以造成了存儲在該進程內的Session丟失。

    哪些情況下該進程會重起呢?微軟的一篇文章告訴了我們:
    1、配置文件中processModel標簽的memoryLimit屬性
    2、Global.asax或者Web.config文件被更改
    3、Bin文件夾中的Web程序(DLL)被修改
    4、殺毒軟件掃描了一些.config文件。
    更多的信息請參考PRB: Session variables are lost intermittently in ASP.NET applications

    解決辦法:
    前面說到的sessionState標簽中mode屬性可以有三個取值,除了InProc之外,還可以為StateServer、SQLServer。這兩種存Session的方法都是進程外的,所以當aspnet_wp.exe重起的時候,不會影響到Session。

    現在請將mode設定為StateServer。StateServer是本機的一個服務,可以在系統服務里看到服務名為ASP.NET State Service的服務,默認情況是不啟動的。當我們設定mode為StateServer之后,請手工將該服務啟動。

    這樣,我們就能利用本機的StateService來存儲Session了,除非電腦重啟或者StateService崩掉,否則Session是不會丟的(因Session超時被丟棄是正常的)。

    除此之外,我們還可以將Session通過其他電腦的StateService來保存。具體的修改是這樣的。同樣還在sessionState標簽中,有個stateConnectionString='tcpip=127.0.0.1:42424'屬性,其中有個ip地址,默認為本機(127.0.0.1),你可以將其改成你所知的運行了StateService服務的電腦IP,這樣就可以實現位于不同電腦上的Asp.net程序互通Session了。

    如果你有更高的要求,需要在服務期重啟時Session也不丟失,可以考慮將mode設定成SQLServer,同樣需要修改sqlConnectionString屬性。關于使用SQLServer保存Session的操作,請訪問這里。

    在使用StateServer或者SQLServer存儲Session時,所有需要保存到Session的對象除了基本數據類型(默認的數據類型,如int、string等)外,都必須序列化。只需將[Serializable]標簽放到要序列化的類前就可以了。
    如:
    [Serializable]
    public class MyClass
    {
    ??? ......
    }
    具體的序列化相關的知識請參這里。

    至此,問題解決。
    關于asp.net Session丟失問題的總結
    asp中Session的工作原理:
    asp的Session是具有進程依賴性的。ASP Session狀態存于IIS的進程中,也就是inetinfo.exe這個程序。所以當inetinfo.exe進程崩潰時,這些信息也就丟失。另外,重起或者關閉IIS服務都會造成信息的丟失。

    asp.net Session的實現
    asp.net的Session是基于HttpModule技術做的,HttpModule可以在請求被處理之前,對請求進行狀態控制,由于Session本身就是用來做狀態維護的,因此用HttpModule做Session是再合適不過了。

    原因1:
    bin目錄中的文件被改寫,asp.net有一種機制,為了保證dll重新編譯之后,系統正常運行,它會重新啟動一次網站進程,這時就會導致Session丟失,所以如果有access數據庫位于bin目錄,或者有其他文件被系統改寫,就會導致Session丟失

    原因2:
    文件夾選項中,如果沒有打開“在單獨的進程中打開文件夾窗口”,一旦新建一個窗口,系統可能認為是新的Session會話,而無法訪問原來的Session,所以需要打開該選項,否則會導致Session丟失

    原因3:
    似乎大部分的Session丟失是客戶端引起的,所以要從客戶端下手,看看cookie有沒有打開

    原因4:
    Session的時間設置是不是有問題,會不會因為超時造成丟失

    原因5:
    IE中的cookie數量限制(每個域20個cookie)可能導致session丟失

    原因6:
    使用web garden模式,且使用了InProc mode作為保存session的方式

    解決丟失的經驗
    1. 判斷是不是原因1造成的,可以在每次刷新頁面的時候,跟蹤bin中某個文件的修改時間
    2. 做Session讀寫日志,每次讀寫Session都要記錄下來,并且要記錄SessionID、Session值、所在頁面、當前函數、函數中的第幾次Session操作,這樣找丟失的原因會方便很多
    3. 如果允許的話,建議使用state server或sql server保存session,這樣不容易丟失
    4. 在global.asa中加入代碼記錄Session的創建時間和結束時間,超時造成的Session丟失是可以在SessionEnd中記錄下來的。
    5. 如果有些代碼中使用客戶端腳本,如javascript維護Session狀態,就要嘗試調試腳本,是不是因為腳本錯誤引起Session丟失

    posted on 2009-06-08 12:00 freebird 閱讀(304) 評論(0)  編輯  收藏 所屬分類: dotnet

    主站蜘蛛池模板: 亚洲AV无码久久精品蜜桃| 亚洲人成影院在线无码按摩店| 综合自拍亚洲综合图不卡区| 免费观看成人久久网免费观看| 亚洲真人无码永久在线| 九九99热免费最新版| 国产亚洲老熟女视频| 久久精品视频免费播放| 亚洲综合国产精品| 日本免费网站视频www区| 亚洲三级在线免费观看| 性xxxx视频播放免费| 老司机亚洲精品影院在线观看| 俄罗斯极品美女毛片免费播放| 深夜免费在线视频| 亚洲国产精品无码久久一区二区| 少妇人妻偷人精品免费视频| 内射干少妇亚洲69XXX| 91在线视频免费看| 国产精品亚洲综合天堂夜夜| 国产国拍亚洲精品福利 | 国产亚洲Av综合人人澡精品| 亚洲 国产 图片| 两个人看的www免费| 亚洲第一二三四区| 最好免费观看韩国+日本 | 久久久无码精品亚洲日韩按摩 | 好爽…又高潮了毛片免费看| 午夜亚洲WWW湿好爽| 精品亚洲成α人无码成α在线观看 | wwwxxx亚洲| 亚洲毛片av日韩av无码| 一级毛片成人免费看免费不卡| 亚洲精品国产国语| 国产精品亚洲玖玖玖在线观看 | 无码国模国产在线观看免费 | 麻花传媒剧在线mv免费观看| 久久精品熟女亚洲av麻豆| 亚洲午夜国产精品无码老牛影视 | 特黄aa级毛片免费视频播放| 久久亚洲AV无码精品色午夜麻|