ASP.NET会话状态Sql Server模式

时间:2011-03-23 16:06:39

标签: asp.net sql-server session-state

我的问题是关于上面写的标题。目前我有一些功能依赖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;"/>

非常感谢您的帮助,提前谢谢。

1 个答案:

答案 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中创建会话状态表。