熱點推薦:
您现在的位置: 電腦知識網 >> 操作系統 >> Windows系統管理 >> 正文

稀疏平常的ASP.NET Session Lost問題

2022-06-13   來源: Windows系統管理 

《Windows 用戶態程序高效排錯》市場價元 特價元 購買>>   

           簡單的問題最棘手稀疏平常的ASPNET Session Lost問題

          問題描述

       客戶抱怨剛剛開發完成的大型ASPNET站點測試階段一切正常但是放到生產環境上運行壓力一大就會發生Session Lost現象問題的表現是一個NullReferenceException異常分析代碼後發現NullReferenceException是試圖訪問一個SessionObject時候發生的SessionObject應該在前面就已經設置過問題半年來一共就發生過而且是在個不同的頁面發生

          制定策略

       這個問題困難的地方在於重現的幾率很小沒有多少詳細觀察的機會所以必須制訂非常周全的計劃以便問題再次發生的時候獲取足夠多的信息如何制訂周密的計劃呢?

       思路非常直觀了解Session實現的細節總結出導致問題的所有可能性獲取信息的時候排查所有的可能性

       關於ASPNET Session的細節可以參考

Underpinnings of the Session State Implementation in ASPNET

有了對Session的理解後把這個問題分成了下面幾種情況

        客戶使用了負載均衡的環境但是沒有正確配置基於數據庫或者服務的Session模式或者是幾台服務器的Machine key沒有配置成一致跟客戶確認後排除了這種情況因為客戶只有一個服務器使用的InProc

         最簡單的情況就是所有的用戶所有的session都丟了這種情況一般發生在InProc的session mode上原因就是appdomain重啟或者IIS進程崩潰可以通過性能日志或系統日志來排查

         稍微麻煩一點的就是某一個用戶的session丟了而沒有影響到所有用戶觀察方法是首先在session start裡面做log把每一個session的創建時間以及session id都記錄到本地的一個log裡面同時往session裡面添加一個測試用的session value問題發生的時候在ASPNET的全局錯誤處理函數中當前的session id讀出來比較log中的記錄看看這個session是不是剛剛建立的如果是很有可能是客戶端的原因導致session id丟了比如IE crash導致cookie丟失

         如果不是那就看看測試用的session value是不是丟了如果這個也丟了應該是代碼中掉了SessionClear

         如果測試用的session value沒有丟情況就變成一個用戶的session裡面的一部分value丟了很可能是由於用戶的代碼邏輯導致的解決方法就是通過更詳細的log來定位問題然後閱讀代碼來檢查

可以看到問題的特征跟潛在的根源是對應的目的在於區分出這種情況

        所有用戶的所有Session全沒有了

         一個用戶的Session沒有了

         一個用戶的部分Session沒有了

針對每種情況采取的log策略是

        對於第類情況可以在Application_Start/End函數中記錄下時間來檢查Appdomain是不是重新啟動過

        對於第類情況log文件應該記錄下session id和session創建的時間以便判斷問題是否是cookie id lost導致的如果是cookie id lost那問題就出在客戶端或者是網絡原因

        對於第類情況可以在工程中搜索所有Session Clear的調用每次調用前寫log文件來記錄如果工程很大無法逐一添加可以加載調試器在Session Clear函數中設定條件斷點來記錄

           具體操作和結論

總結下來具體的實現是

          在globalasax文件的session_start中把這個session的創建時間記錄到session裡面這個創建時間也同時充當測試用的session value

         代碼中對session操作的地方寫log到以sessionid為文件名的文件中去

         用log文件記錄每次session的操作發生在什麼函數發生的時間session內容的變化

          當Exception發生的時候在Exception handler中記錄發生問題的session id和殘留下來的Session value

        這樣問題發生的時候根據Exception handler記錄的session id找到log文件就可以很清楚地得到所需要的信息

在做了上述部署之後等了大約一個星期問題重現了在log文件中發現這樣的信息

         某一個用戶的部分Session丟失

         從Session創建時間看該Session已經維持很長時間了

         通過檢查Session Clear的調用紀錄發現丟失的Session的確是由用戶自己的代碼清除的同時發現這些代碼的運行次序跟設計不吻合根據設計初衷在清除 Session後頁面會重定向到一個專門的頁面並重新添加Session然後繼續操作但是log表明這個專門的頁面並沒有得到執行


From:http://tw.wingwit.com/Article/os/xtgl/201311/10173.html
    推薦文章
    Copyright © 2005-2022 電腦知識網 Computer Knowledge   All rights reserved.