我的问题是关于上面写的标题。目前我有一些依赖 session 来完成工作的功能。当保留默认值时,一切都会顺利进行。但是,我不喜欢在崩溃时丢失 session 的想法,因此我修改了 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;"/>
非常感谢您的帮助,提前致谢。
最佳答案
假设您的代码没有错误是不安全的。我想到的一种情况是您正在缓存的对象未标记为 serializable 。通常,这会抛出异常,并且您会意识到这一点。但是,如果您还在 catch block 中抑制异常,那么您似乎能够存储值,但无法检索它们。
为什么突然需要使所有对象可序列化?好吧,当您使用 InProc 时,对象存储在内存中。但是,当您使用 SQL 时,需要将它们写入(也称为序列化)数据库。
在代码中:
try {
Session["MyKey"] = SomeNonSerializableObject
}
catch (Exception e)
{
' Suppress all exceptions
}
我还要确认您的 ASPState 用户(示例中的 mytest
)拥有所需的所有正确权限。测试这一点的简单方法是让他们成为 ASPState 数据库和临时数据库的 db_owner。如果这解决了问题,那么您就知道这是数据库权限问题。
我听到你问为什么是 tempdb?好吧,默认情况下, session 状态表将在 tempdb 中创建。
关于ASP.NET session 状态 Sql Server 模式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5408197/