我最近的任务是修复因滥用会话状态而导致的相当讨厌的错误。我们有一个asp.net Web应用程序,它使用inproc会话状态在单个服务器上运行。基本设计是从数据库加载类型化数据集,并使用常见的会话变量名称(如Session [“dataset”] = dataset)以会话状态存储。在将数据存储在会话中之后,用户编辑数据,从更新的会话中检索数据集并将其发送到数据库以进行更新。这种类型的数据编辑\存储用于多个webforms,基本上做同样的事情。一切都很好,直到用户尝试启动应用程序的第二个实例,并且会话变量中存储的数据可能会混淆。
以下是我能够找到的可能修复
设置sessionState cookieless =“false”(每个新实例获取唯一的会话ID) PROS - 最简单的解决方案,几乎不需要更改代码 用户可以编辑guid,guid可以复制
为每个实例使用自定义会话密钥(传递会话密钥并将其组合为“数据集”+会话密钥名称,以便每个实例都具有唯一的会话变量) PROS - 网址没有guid 缺点 - 大量代码更改,可能是脆弱的
删除会话变量(第二次从数据库加载数据集进行编辑) PROS-释放服务器资源,不再依赖于会话状态 缺点 - 性能损失,代码更改量大
任何人都知道任何其他可能的解决方案?感谢
答案 0 :(得分:0)
嗯,保证两个实例不会访问同一个会话状态的唯一方法是使用url / POST-data执行某些操作。这就是你必须要玩的东西。
最简单的可能是使用cookieless = true,并希望所有url:s都能正确重写。最好的可能只是直接访问数据库,很可能它不会影响你想象的那么多,如果它影响,你真的不应该为每个用户缓存大量数据,而应该使用全局缓存。
答案 1 :(得分:0)
您声明第三个选项会影响性能(完全删除会话对象),但您尝试过吗?
我问,因为序列化标准数据集is notoriously resource intensive on the server side - 在许多情况下内存占用量可能增加一个数量级(1MB数据集可能需要10-15MB才能序列化),以及处理器时间要做此
我真的建议您尝试尝试3并进行测试,看看您的问题是否有充分根据,或者您是否确实看到了性能提升;)
如果您设置了在会话中存储数据集,那么您应该查看custom serialisation以最小化存储的数据量。