状态服务器上的多个序列化损坏属性值

时间:2011-07-20 23:41:04

标签: asp.net-mvc-2 serialization dependency-injection state

我的ASP.NET MVC应用程序中存在异常的序列化/反序列化行为。

设置和架构如下:

.Net 3.5,MVC 2,Unity 2.0用于依赖注入,IIS 7.状态存储在ASPNET状态进程中。除了模型,视图和控制器之外的应用程序还包含许多特定于应用程序的服务和模型映射器(用于与现有代码连接)。其中两个服务具有基于会话的生命周期,我为其实现了自定义PerSessionLifetimeManager(因为Unity没有开箱即用的服务)。此生命周期管理器使用HttpContext.Current.Session来存储对象。控制器,映射器,服务和服务之间也存在相当多的依赖关系。

问题:

会话生存期服务之一包含一个私有布尔字段,该字段在某些内部逻辑条件下更改值,但是此值会在我的代码之外更改。经过一番调查后,我发现问题与每次序列化/反序列化的对象有关,并且在序列化过程中字段的值不同。

到目前为止进行的调查:

我有一个断点/登录对象构造函数,我将字段包装到属性中并将断点/日志记录放置在setter上。对象肯定只构造一次,并且除了应该调用的属性值之外没有更改属性值的调用。我已经创建了实现ISerializable的对象,并且记录了System.Threading.Thread.CurrentThread.ManagedThreadId和对象哈希(从对象的所有字段构造)。从我所看到的,如果属性/字段更改对象的值使用新值一次序列化两次,并且紧接着原始值。下次使用对象时,它以LIFO顺序反序列化,因此首先拉出原始(未更改的)值对象,然后拉出更改的对象。我尝试记录这些序列化调用的完整堆栈跟踪,但它似乎是所有.Net内部调用。

问题:

为什么有多个序列化具有不同的值?怎么避免这个?

目前的解决方法:

我使用Session代替私有字段/属性并且它工作正常,但是在负载很重的网站上使用会话并不是最好的事情,我希望能够提供其他解决方案。

谢谢。

1 个答案:

答案 0 :(得分:-1)

您确定该值是否已损坏,或者您是否由于会话被清除而丢失了该值。会话中是否还有其他值同时消失?我对你的状态有点困惑,状态存储在ASPNET状态进程中。 "声明。您的会话管理是设置为InProc还是使用StateServer?如果它是InProc,您肯定会遇到会话值丢失(特别是在共享托管环境中),并且应该切换到ASP状态服务器服务或MSSQL状态服务器解决方案。