2013-01-08 59 views
4

我在嘗試將會話變量強制轉換爲屬於變量類型時出現了一些「幾乎隨機」的錯誤。 只是要清楚:ASP.NET不能在相同類型的變量中投射會話變量

我有一個類「Elemento的」,我只是創建它的istance並把它放在我的會話變量:

Elemento elem = new Elemento(id, quantity); 
list.Add(elem); 
context.Session["cart"] = list; 

現在我要收回我的列表,我試圖做到這一點:

list = (List<Elemento>)context.Session["cart"]; 

那麼..這個「有時」的作品,有時不是!第一次我嘗試了它的工作flawlessy,但現在我有「內部服務器錯誤500」與此錯誤:

Impossibile eseguire il cast di [A]System.Collections.Generic.List 1[Elemento] a [B]System.Collections.Generic.List 1[Elemento]. Il tipo A ha origine da 'mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' nel contesto 'LoadNeither' nella posizione 'C:\Windows\assembly\GAC_64\mscorlib\2.0.0.0__b77a5c561934e089\mscorlib.dll'. Il tipo B ha origine da 'mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' nel contesto 'LoadNeither' nella posizione 'C:\Windows\assembly\GAC_64\mscorlib\2.0.0.0__b77a5c561934e089\mscorlib.dll'.

翻譯吧..

Cannot cast [A]System.Collections.Generic.List 1[Elemento] to [B]System.Collections.Generic.List 1[Elemento]. Type A have origin from 'mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' with context 'LoadNeither' and position 'C:\Windows\assembly\GAC_64\mscorlib\2.0.0.0__b77a5c561934e089\mscorlib.dll'. Type B have origin from 'mscorlib, Version=2.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089' with context 'LoadNeither' and position 'C:\Windows\assembly\GAC_64\mscorlib\2.0.0.0__b77a5c561934e089\mscorlib.dll'.

我可以解決這個「一段時間「清空IIS緩存..但它會再次發生時,我從Visual Studio中生成解決方案。

我在一些地方閱讀,我可以使用接口解決此問題..但由於我仍然在學習如何使用它們,我不能直接嘗試,現在有一些經過測試的解決方案呢?

編輯: 工程與krshekhar解決方案:

list = context.Session["cart"] as List<Elemento>; 

謝謝!

+0

檢查您的會話context.Session [「cart」]是否存在,並且在投射前它不爲null。 –

+0

是的,我已經這樣做,抱歉沒有寫在主帖! – HypeZ

+0

嘗試使用list = context.Session [「cart」]作爲列表; –

回答

0

我相信這可能是IIS內存的問題。你有沒有嘗試重新啓動IIS?使用另一個IIS服務器?

我建議使用一些其他方式來存儲對象,如Cookies。

如果您考慮可擴展性 - Cookies將爲您提供更好的解決方案,然後會話對象,因爲它們存儲在客戶端而不是服務器。

祝您好運

+0

我不能使用餅乾這:(重新啓動IIS工程..直到我再次建立項目!whaaattt – HypeZ

0

的既然你提到你在重建的錯誤,似乎這裏的可能性是存在的Elemento類或者其他類,它引用,這是打破反序列化內部的變化到田間地頭來自會話狀態的對象。

將「複雜」對象存儲到IIS會話狀態時,它們使用BinaryFormatter(位於System.Runtime.Serialization.Formatters.Binary名稱空間中)進行序列化。此格式化程序對序列化類中的更改非常敏感,並且如果圖中的任何類自數據最初序列化以來發生更改,則該格式化程序可能無法成功反序列化對象圖。這似乎是這裏的問題,因爲你說它在重建之後會中斷。

我建議你只將BCL中的類型保存到會話狀態(因爲這些只會在.NET版本之間改變)。或者更好的是,通過在您的Elemento對象上實現ISerializable接口來實現您自己的定製序列化,這將允許您保持項目構建之間的兼容性。

+0

與krshekhar的解決方案一切運作良好,我希望我不能重新實現一個ISerializable接口eheh 但是..即使有這個解決方案有時我會從會話中得到一些損壞的數據..它與我構建它時,或時間流逝,或瀏覽器使用時無關。仍然無法理解爲什麼 – HypeZ