【问题标题】:Casting objects from session in ASP.NET C#在 ASP.NET C# 中从会话中转换对象
【发布时间】:2012-10-08 00:51:55
【问题描述】:

序言:我在旧环境 ASP.NET/.NET 2.0 中工作,没有 Visual Studio。目前记事本++和FTP。虽然不太理想,但这是我目前处理的手牌。我目前无法直接/直接控制 IIS 实例或服务器机器。


我在会话中存储了一个Foo 类型的对象:

this.Session["foo"] = new Foo();
this.Response.Redirect("the/second/page");

在第二页上,我从会话中检索,并尝试将其转换为使用:

Foo foo = (Foo) this.Session["foo"];

我收到了:

System.InvalidCastException: Unable to cast object of type 'Foo' to type 'Foo'.

当我在第二页通过.GetType() 比较类型名称时:

Foo in session:      ASP._dev_blah_aspx+Foo  
New instance of Foo: ASP._dev_blah_aspx+Foo

但是他们通过.GetType().GUID 的类型GUID 是不同的:

Foo in session:      a67f218d-...
New instance of Foo: 267f20ea-...

这可能与question/answer 有关吗?我会尝试,但请参阅序言。

【问题讨论】:

  • 你的班级住在哪里?是在 App_Code 文件夹中,还是在页面上定义的?
  • 在页面上定义,脚本块;所以嵌套类。
  • Foo 是否标记为序列化?
  • @StefanP 不,但我认为序列化只对在其他地方持续存在的会话对象很重要。我只是使用本机会话存储实现。不是这样吗?

标签: c# asp.net casting session-state


【解决方案1】:

当您上传代码时,请尝试强制重新编译。最简单的方法是touch你的web.config。只需用记事本++打开并在任何地方添加一个空格,以便服务器识别它已更改。

【讨论】:

  • 天哪,它起作用了……不过,每次我更改类定义时,我都必须触摸Web.config。尽管如此,我将其标记为正确; T-3 分钟。
  • @Bracketworks - 我很高兴它成功了!我不确定你是否需要每次都这样做。这个错误偶尔发生在我身上,我认为它与缓存服务器中的 DLL 有关。
  • 再次感谢@SystemDown,希望我不必经常这样做。更好的是,希望我能得到我正在等待的 VS 许可证和虚拟服务器环境;)
  • @Bracketworks - 为什么不在等待的时候使用 Express 版本?它们是免费的,完全可以满足您的需求。
  • 我愿意,但我宁愿等待我的 Premium 许可证到期,而不是阻塞软件请求过程。
【解决方案2】:

防止这种情况发生的另一种方法是始终在上传网站之前对其进行预编译(使用 Visual Studio 中的发布选项)

【讨论】:

  • 抱歉@iamkrillin,“...ASP.NET/.NET 2.0,没有 Visual Studio。”
  • 假设您有一个项目文件,您仍然可以通过直接从命令行调用 msbuild 来实现相同的目的。 (从项目所在的目录中) 1) msbuild /target:ResolveReferences;_CopyWebApplication /property:Configuration=Release;OutputPath=C:\Build\bin;WebProjectOuptutDir=C:\Build
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多