2010-08-17 48 views
4

我已經繼承了一個非常大的ASP.NET應用程序,需要修改它才能使用狀態服務器而不是in-proc會話。我需要在整個應用程序中跟蹤會話中使用的所有類,然後確定它們是否可以序列化。是否有任何工具可用於分析代碼以確定會話中使用的類?確定ASP.NET中的哪些對象用於會話中

回答

1

您可以方便地使用以下(C#)當前會話對象的快速的「快照」代碼:

BinaryFormatter b = new BinaryFormatter(); 
StringBuilder debug = new StringBuilder(); 
MemoryStream m; 

foreach (String s in Session.Keys) { 
    // try to serialize the object 
    var obj = Session[s]; 
    if (obj != null) { 
     m = new MemoryStream(); 
     try { 
      b.Serialize(m, obj); 
      debug.AppendFormat("{0}: {1} bytes\n", s, m.Length); 
     } 
     catch (Exception ex) { 
      debug.AppendFormat("ERROR: {0}, Message: {1}\n", s, ex.Message); 
     } 
    } 
} 

然後顯示在你喜歡的文本容器中的「調試」字符串。

這很有幫助,因爲只需切換到狀態管理器/ SQL Server就可以告訴你什麼不能被序列化,但它會停在第一個不可序列化的對象上。它也不會告訴你哪個鍵「擁有」該對象。

代碼改編自this Stackoverflow answer

1

在Visual Studio中,您可以使用通配符映射進行搜索並搜索類似於Session [* =的模式。

另一種方法是在調試時使用立即窗口,並在瀏覽您的網站後請求會話狀態。沒有充分的證據,但已經可以提供幫助。

另一種技術就是將會話狀態設置爲Sql Server或狀態管理器模式(out of process),調試並查看在對象無法序列化的情況下開始投訴的位置。在同一時間,您還會徹底測試您的應用程序。

相關問題