C# 从会话状态读取时出现InvalidCastException异常

C# 从会话状态读取时出现InvalidCastException异常,c#,asp.net,C#,Asp.net,当我在Visual Studio 2013中调试我的网站项目时,我在尝试将会话项强制转换为特定类型ZZZZ时遇到了一个问题 return (ZZZZ) Session["SessionItem"]; 将抛出包含以下内容的InvalidCastException 中发生“System.InvalidCastException”类型的异常 App_Code.axv-bzrg.dll,但未在用户代码中处理 其他信息:无法将类型为“XXX.yyy.ZZZZ”的对象强制转换为类型为“XXX.yyy.ZZ

当我在Visual Studio 2013中调试我的网站项目时,我在尝试将会话项强制转换为特定类型ZZZZ时遇到了一个问题

return (ZZZZ) Session["SessionItem"];
将抛出包含以下内容的InvalidCastException

中发生“System.InvalidCastException”类型的异常 App_Code.axv-bzrg.dll,但未在用户代码中处理 其他信息:无法将类型为“XXX.yyy.ZZZZ”的对象强制转换为类型为“XXX.yyy.ZZZZ”

我加了一块手表

(WebUser) Session["LoggedInUser"]
手表的数值部分显示以下内容:

“App_Code.axv bzrg.dll”和“App_Code.axv bzrg.dll”中都存在类型“XXX.YYYY.ZZZZ” 'App_Code.ys_ymegf.dll'

我导航到临时ASP.NET文件文件夹

C:\Users\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu 文件\root\dc8aa7ce\b2661c39


两个DLL文件就在那里。我认为每个页面请求都会生成App_代码DLL,但是之前的DLL没有被删除,导致Temp目录中有两个重复的类型。为什么会发生这种情况?我该如何着手解决这一问题?

这在某种程度上是意料之中的行为

第一次导航到页面-对象添加到会话状态,类型为page_V1.dll:MyType

您决定触摸页面的源以修复某些问题-因为它不会杀死会话cookies,再次导航到同一页面将尝试从内存中获取对象会话状态会话状态不会丢失,因为应用程序池不会因为页面更改而重新启动。此时,您的页面再次编译,现在尝试将会话中存储的类型大小写为新类型page_v2.dll:MyType,但确实失败,因为类型彼此不相关,即使它们在其他方面相同

修正:

出于调试目的-启动新浏览器会话/清除Cookie或只触发应用程序池回收,即通过触摸web.Config。 考虑移动对象到类库项目,并从Web站点添加对它的引用——这样您就可以控制类型实际上是如何重新编译的,因此不会因为动态生成的程序集文件名而丢失身份。
停止IIS并清除所有\临时ASP.NET文件\通常可以修复此问题。更罕见的是,清理/重建修复了它。你是对的,它确实修复了,但我不能每次都停止IIS或重建,因为它将无法调试。此外,删除临时文件也是可能的,但非常烦人且效率低下。此外,我没有一个干净的选择这个项目。猜猜为什么会这样?干净的解决方案应该在上下文菜单上。Clean重新编译所有内容,包括VisualStudio认为不需要重新编译的内容。这已经有一段时间了,但有时当动态编译器不喜欢您在标记中设置指令时,就会发生这种情况。另一个更激进的解决方案是从一个网站切换到一个WebApplication,它具有更可预测的编译/更少的古怪,尤其是当项目规模越来越大时。