从会话状态

时间:2015-05-15 19:12:38

标签: c# asp.net

当我在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"]

以下内容显示在手表的值部分:

  

“App.Code.axv-bzrg.dll”中存在“XXX.YYYY.ZZZZ”类型   'App_Code.ys_ymegf.dll'

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

  

C:\ Users _________ \ AppData \ Local \ Temp \ Temporary ASP.NET   文件\根\ dc8aa7ce \ b2661c39

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

1 个答案:

答案 0 :(得分:2)

这是一种预期的行为。

您首次导航到页面 - 对象已添加到类型为page_V1.dll:MyType的会话状态。

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

修复:

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