【问题标题】:Where to place code for Session objects in ASP.NET app在 ASP.NET 应用程序中放置 Session 对象的代码的位置
【发布时间】:2010-08-21 22:10:10
【问题描述】:

我在尝试使用 Session State Server 而不是 InProd 时遇到序列化错误。但是,我无法弄清楚是什么导致了会话中的错误。我得到了一些代码来添加到页面中以循环访问会话对象并确定其中的每个项目是否是可序列化的。我的问题是我不知道将代码放在 ASP.NET 页面中的什么位置。在跟踪代码时,错误只是在单步执行页面外的对象后出现,而不是在设置会话时出现。必须有一些地方可以在页面上放置所有会话对象之后但页面会出错之前的代码。那会在哪里?

【问题讨论】:

  • 发生这种情况时你会得到堆栈跟踪吗?这通常会提供一些额外的信息。
  • 我无法从异常中分辨出会话设置的位置,并且我无法在代码中找到它。这就是为什么我需要检查会话对象。

标签: asp.net session-state


【解决方案1】:

您可以将它放在页面加载中,设置断点,然后逐步执行反序列化代码,直到它停止 - 这将告诉您哪个对象尚未可序列化并阻止转换以使用 SQL 进行会话。如果没有为您提供用于测试可序列化的源代码,这很难说。

考虑一下您在此处尝试执行的操作可能会有所帮助。因为 SQL State Server 要求对象是可序列化的,而 InProc 不需要,所以您放入 Session 的任何对象都需要是可序列化的。

因此,您想验证存储在 Session 中的任何对象是否可序列化,或者,正如其他回答者所说,找出哪个对象不可序列化并导致问题。

test whether an object can be Serialized 很容易。您可以使用提供的示例代码,或者只创建一个单元测试(或者在页面加载中为您的应用进行测试,如果这更容易的话)来测试您在会话中存储的各种类型是否可序列化。

【讨论】:

  • 页面加载太早了。该错误不会在设置会话时发生,而是在页面准备好发送回时发生。我只需要一个设置所有会话但在它出错之前的地方。
【解决方案2】:

这个问题的答案是将代码放在 SaveStateComplete 事件处理程序中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-06-09
    • 2010-10-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多