我们有一个MVC应用程序,该应用程序在某种程度上非常依赖于在会话中存储内容(不是我的设计)。此应用程序在生产中的两台服务器之间实现负载平衡。在测试中,我们只有一台服务器。我们将用户会话存储在数据库中,以防止用户在部署过程中被踢。这是一个高可用性应用程序,因此中断次数越少越好。
我们在会话中存储的一件事是一个类的实例。让我们将类称为Foo:
public class Foo
{
public int Bar { get; set; }
}
我试图重构一些代码,最终将Bar重命名为BarId,这样其目的就更加清楚了。在开发和测试中,一切看起来都不错。但是,当我们开始部署到生产环境时,用户开始收到空引用异常。该错误发生在从会话中检索Foo的代码行中。代码看起来像这样:
If(Session["foo"] != null)
{
var foo = (Foo)Session["foo"];
using(var context = new BarContext())
{
_barRepo = new GenericRepository<Bar>(context);
_bar = _barRepo.GetById(foo.Bar);
}
}
最终发生的是,尽管Session["foo"]
不为null,但未成功将其转换为Foo类型的对象,因此foo为null。转换失败的原因是,会话对象仍然具有Bar成员而不是Foo类中的BarId成员。
这很难测试,但是当我将BarId重新命名为Bar时,该问题已解决,因此我可以确定这是原因。
我的问题是:是否有一种方法可以对此类或任何其他会话变量进行更改,而不必通过删除会话来使所有用户退出应用程序?