【问题标题】:InvalidCastException exception when reading from session state从会话状态读取时出现 InvalidCastException 异常
【发布时间】:2015-05-28 06:22:10
【问题描述】:

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

return (ZZZZ) Session["SessionItem"];

一个 InvalidCastException 被抛出,内容如下

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

我为

添加了一个手表项目
(WebUser) Session["LoggedInUser"]

手表的Value部分显示如下:

类型 'XXX.YYYY.ZZZZ' 存在于 'App_Code.axv-bzrg.dll' 和 'App_Code.ys_ymegf.dll'

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

C:\Users_________\AppData\Local\Temp\Temporary ASP.NET 文件\root\dc8aa7ce\b2661c39

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

【问题讨论】:

  • 停止 IIS 并清除所有 \Temporary ASP.NET Files\ 通常可以修复它。很少有清理/重建修复它。
  • 你是对的,但我不能每次都停止 IIS 或重建(无法调试)。此外,删除临时文件是可能的,但非常烦人且效率低下。另外,我没有这个项目的清洁选项。猜猜为什么会这样?
  • 清洁解决方案应该在上下文菜单中。 Clean 重新编译所有内容,包括 Visual Studio 认为不需要重新编译的内容。已经有一段时间了,但有时当动态编译器不喜欢您在标记中设置指令的方式时会发生这种情况。另一个更激进的解决方案是从 WebSite 切换到 WebApplication,它具有更可预测的编译/不那么古怪,尤其是随着项目规模越来越大。

标签: c# asp.net


【解决方案1】:

这在某种程度上是预期的行为。

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

您决定触摸页面的源来修复某些问题 - 因为它不会终止会话 cookie 再次导航到同一页面将尝试从内存会话状态中获取对象(会话状态不会丢失,因为应用程序池未重新启动由于只是页面更改)。此时您的页面再次编译,现在尝试将会话中存储的类型转换为新类型page_v2.dll:MyType,这确实失败了,因为类型彼此不相关(即使它们在其他方面相同)。

修复:

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

【讨论】:

    猜你喜欢
    • 2012-11-07
    • 1970-01-01
    • 1970-01-01
    • 2016-08-24
    • 1970-01-01
    • 2022-10-19
    • 2017-12-15
    • 1970-01-01
    • 2011-08-27
    相关资源
    最近更新 更多