我的问题是关于上面写的标题。目前我有一些功能依赖Sessions来完成这项工作。当它保持默认时,一切都很顺利。但是,我不喜欢在崩溃的情况下丢失会话的想法,我已经修改了我的web.config以改为使用Sql Server模式。
我已经运行了必要的命令,使用aspnet_sql.exe在我的数据库中创建表和存储过程
我能够将值存储到数据库中,但尚未成功检索它们。由于它在InProc模式下工作正常,我想我可以放心地认为我的代码没有任何问题。
这是我的web.config设置:
<sessionState mode="SQLServer" allowCustomSqlDatabase="true" cookieless="false" timeout="120" sqlCommandTimeout="30" compressionEnabled="true"
sqlConnectionString="Data Source=.\SQLExpress;Initial Catalog=mytest;Persist Security Info=True;User ID=mytest;Password=mytest;"/>
非常感谢您的帮助,提前谢谢。
答案 0 :(得分:4)
假设您的代码没有错误是不安全的。我想到的一个场景是,您缓存的对象未标记为serializable。通常,这会引发异常,你会意识到它。但是,如果您还在catch块中抑制异常,那么您似乎可以存储值,但不能检索它们。
为什么你突然需要将所有对象都序列化?好吧,当你使用InProc时,你的对象存储在内存中。但是,当您使用SQL时,需要将它们(AKA序列化)写入数据库。
在代码中:
try {
Session["MyKey"] = SomeNonSerializableObject
}
catch (Exception e)
{
' Suppress all exceptions
}
我还要确认您的ASPState用户(在您的示例中为mytest
)具有所需的所有正确权限。测试它的简单方法是在ASPState数据库 AND 临时数据库中使它们成为db_owner。如果这可以解决问题,那么您就知道这是数据库权限问题。
为什么我会听到你提到的tempdb?好吧,默认情况下,会在tempdb中创建会话状态表。