繁体   English   中英

从会话状态读取时,InvalidCastException异常

[英]InvalidCastException exception when reading from session state

当我在Visual Studio 2013中调试网站项目时,尝试将Session项目转换为特定类型(ZZZZ)时遇到问题。

return (ZZZZ) Session["SessionItem"];

引发InvalidCastException并显示以下内容

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

我添加了一个手表项目

(WebUser) Session["LoggedInUser"]

手表的“价值”部分显示以下内容:

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

我导航到Temporary ASP.NET Files文件夹

C:\\ Users _________ \\ AppData \\ Local \\ Temp \\ Temporary ASP.NET Files \\ root \\ dc8aa7ce \\ b2661c39

并且两个DLL文件都在其中。 我认为App_Code DLL是在每个页面请求上生成的,但是先前的DLL没有被删除,从而导致Temp目录中存在两种重复的类型。 为什么会发生这种情况,我该如何解决呢?

这是某种预期的行为。

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

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

固定:

  • 出于调试目的-启动新的浏览器会话/清除cookie或仅触发应用程序池回收(即,通过触摸web.Config)。
  • 考虑将对象移动到类库项目并从网站添加对它的引用-这样,您可以控制实际重新编译类型的时间,因此不会因动态生成的程序集文件名而丢失标识。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM