2015-05-15 32 views
-1

當我在Visual Studio 2013中調試我的Web站點項目時,我嘗試將一個Session項目轉換爲特定類型(ZZZZ)時出現問題。從會話狀態讀取時發生InvalidCastException異常

return (ZZZZ) Session["SessionItem"]; 

一種引發InvalidCastException具有以下內容

「」類型發生在 App_Code.axv-bzrg.dll的例外,但是在用戶代碼 附加信息沒有處理:無法投射「XXX.YYYY.ZZZZ」類型的對象來鍵入「XXX.YYYY.ZZZZ」。

我加了一個監視項目的

(WebUser) Session["LoggedInUser"] 

其次爲顯示在手錶的價值部分:

類型「XXX.YYYY.ZZZZ」在這兩個存在'App_Code.axv-bzrg.dll' 和 'App_Code.ys_ymegf.dll'

我導航到臨時ASP.NET Files文件夾

C:\用戶_________ \應用程序數據\本地的\ Temp \臨時ASP.NET 文件\ ROOT \ dc8aa7ce \ b2661c39

而兩個DLL文件都在那裏。我認爲App_Code DLL是在每個頁面請求上生成的,但是前面的DLL不會被刪除,從而導致Temp目錄中有兩個重複的類型。爲什麼會發生這種情況,我該如何解決這個問題?

+1

停止IIS並清除所有\ Temporary ASP.NET Files \常常修復它。更少的清潔/重建修復它。 – MatthewMartin

+0

你是對的,但我無法阻止IIS或每次重建(這將是不可能的調試)。此外,刪除臨時文件是可能的,但非常煩人和非生產性。另外,我沒有這個項目的Clean選項。任何猜測爲什麼這可能是? – alex

+0

乾淨的解決方案應該在上下文菜單上。 Clean會重新編譯所有內容,包括Visual Studio認爲不需要重新編譯的內容。 這已經有一段時間了,但有時會發生這種情況,因爲動態編譯器不喜歡在標記中設置指令。 另一個更激進的解決方案是從Web站點切換到WebApplication,它具有更可預測的編譯/更少古怪,特別是隨着項目規模變大。 – MatthewMartin

回答

2

這是有點期待的行爲。

您第一次導航到頁面 - 將對象添加到類型爲page_V1.dll:MyType的會話狀態。

您決定觸摸頁面源來解決某些問題 - 因爲它不會終止導航到同一頁面的會話cookie,它會嘗試從內存中會話狀態獲取對象(會話狀態不會丟失,因爲應用程序池不會由於頁面更改而重新啓動)。此時您的頁面會再次編譯,現在嘗試將會話類型存儲到新類型page_v2.dll:MyType中,因爲類型彼此不相關(即使它們相同)。

修復:

  • 用於調試目的 - 啓動新的瀏覽器會話/清除Cookie或只是觸發應用程序池回收(即通過觸摸的web.config)。
  • 考慮將對象移動到類庫項目並從Web站點添加對它的引用 - 這樣您可以控制何時實際重新編譯類型,從而不會因動態生成的程序集文件名而丟失標識。
相關問題