背景
我们有很多用户保存的报告。这些报告所处的状态将保存到会话中(HttpSessionState
)。
显然这是不好的做法,需要删除。真的不确定为什么它首先就是这样写的。
问题
代码中有一个处理保存这些报告的管理器,基本上是以下代码:
public T GetObject<T>(string reportGuid)
{
try
{
return (T)context.Session[reportGuid];
}
catch
{
return default(T);
}
}
public void SetObject(string reportGuid, dynamic value)
{
this.context.Session.Add(reportGuid, value);
}
足够简单。总的来说,这会让会话变得非常庞大(我们已经看到它们超过1MB)。我们的会话以SQLServer模式存储,因此在某些时候(我假设)会话被序列化并存储在ASPStateTempSessions
表中。
我们尝试用各种序列化程序替换它,例如Microsoft自己的XML Serialiser,JSON.Net的JsonSerialiser和二进制格式化程序。所有这些都写入文件然后检索。
然而,由于某种原因,由于某种原因通常填充了一个字符串的特定字段现在已经丢失了。
奇怪的是我不知道这个字段何时被设置。
public string XsltString
{
get { return this.xsltString; }
set { this.xsltString = value; }
}
这是有问题的字段。我在集合上放了一个断点,它永远不会被原始代码调用。
在旧方法中,会发生这种情况:
SetObject
方法调用ID和报告(value
)。此时XsltString
未设置且为空。GetObject
以使用新信息填充它。调用GetObject
并从会话中检索对象时,XsltString
现在具有值集。使用写入磁盘的方法时,未设置所以我想我有两个问题。
XsltString
如何设定?永远不会调用set方法,当对象进入会话时,它不会被填充。我已经为Get和Set设置了断点,没有任何东西。我还检查了代码,除了通过这个类,其他任何地方都没有访问它。