熱點推薦:
您现在的位置: 電腦知識網 >> 編程 >> .NET編程 >> 正文

Asp.Net處理Session失效解決方案

2013-11-13 10:04:30  來源: .NET編程 

  檢查ASPNET Session是否失效是否超時默認是分鐘設置的方法是SessionTimeOut=;或者您可以設置到更高這個數值的單位是分鐘大家視情況而定

  檢查代碼有無SessionAbandon()之類的一旦調用 Abandon 方法當前會話不再有效同時會啟動新的會話

  ASPNET中使用了ACCESS數據庫而且數據庫是放在bin目錄中的解決方法是不要放會更新的文件在BIN目錄中

  從同一個頁面傳到另一個頁面才能延續同一個session也就是說session不可跨域同時客戶端一關閉浏覽器或一關閉浏覽頁 Session也消失了再次訪問時又會創建新的Session 但還會在服務器上存活等待超時只是調用不到了  另外比如在第一個頁面置了SESSION然後REDIRECT去第二個頁面解決方法是在REDIRECT中設置endResponse為FALSE

  Iframe丟Session的原因session是客戶端和服務器端共同認證的客戶端存儲標識通過附加在頁面的頭發送給服務器端服務器進行識別如果符合條件就可以獲得相應的session操作權

  但如果頁面是來自框架的而框架的父頁和框架不是一個站點的話客戶端默認是禁止向頁面附加頭信息的這樣服務器端就無法識別客戶端框架裡面的頁面自然不能操作Session解決辦法:  ResponseAddHeader(PP CP=CAO PSA OUR)  或者在Window服務中將 State Service 啟動

  有些殺病毒軟件會去掃描您的WebConfig文件那時Session肯定掉這是微軟的說法解決辦法:  使殺病毒軟件屏蔽掃描WebConfig文件(程序運行時自己也不要去編輯它)

  ASPNET默認配置下Session莫名丟失的原因及解決辦法

  正常操作情況下Session會無故丟失因為程序是在不停的被操作排除Session超時的可能另外Session超時時間被設定成分鐘不會這麼快就超時的

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

  ASPNET Session失效的原因

  由於程序是默認配置所以WebConfig文件中關於Session的設定如下

  <sessionState mode=InProc stateConnectionString=tcpip=:

  sqlConnectionString=data source=;Trusted_Connection=yes cookieless=true

  timeout=/>

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

  哪些情況下該進程會重起呢?微軟的一篇文章告訴了我們

  配置文件中processModel標簽的memoryLimit屬性

  Globalasax或者nfig文件被更改

  Bin文件夾中的Web程序(DLL)被修改

  殺毒軟件掃描了一nfig文件

  更多的信息請參考PRB: Session variables are lost intermittently in applications

  ASPNET Session失效的解決辦法

  前面說到的sessionState標簽中mode屬性可以有三個取值除了InProc之外還可以為StateServerSQLServer這兩種存Session的方法都是進程外的所以當aspnet_wpexe重起的時候不會影響到Session

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

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

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

  如果你有更高的要求需要在服務期重啟時Session也不丟失可以考慮將mode設定成SQLServer同樣需要修改sqlConnectionString屬性關於使用SQLServer保存Session的操作在使用StateServer或者SQLServer存儲Session時所有需要保存到Session的對象除了基本數據類型(默認的數據類型如intstring等)外都必須序列化只需將[Serializable]標簽放到要序列化的類前就可以了

  如

  [Serializable]

  public class MyClass

  {

  

  }   


From:http://tw.wingwit.com/Article/program/net/201311/12478.html
    推薦文章
    Copyright © 2005-2013 電腦知識網 Computer Knowledge   All rights reserved.