【问题标题】:ASP.NET Session State Sql Server modeASP.NET 会话状态 Sql Server 模式
【发布时间】:2011-07-21 11:03:33
【问题描述】:

我的问题是关于上面写的标题。目前我有一些依赖会话来完成工作的功能。当它保持默认时,一切都会顺利进行。但是,我不喜欢在崩溃的情况下丢失会话的想法,我已经修改了我的 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;"/>

非常感谢您的帮助,在此先感谢。

【问题讨论】:

  • 在我看来这不是 aspnet_sql.exe 工具,而是 aspnet_regsql.exe 工具 (msdn.microsoft.com/en-us/library/ms229862(v=VS.100).aspx)
  • 是的,这就是工具。我对使用的工具不太精确。但是,通过命令行使用该工具,在我的数据库中创建了表和存储过程。

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


【解决方案1】:

假设您的代码没有错误是不安全的。想到的一种情况是您正在缓存的对象未标记为serializable。通常,这会引发异常,并且您会意识到这一点。但是,如果您还在 catch 块中抑制异常,那么您似乎可以存储值,但不能检索它们。

为什么突然需要让所有对象都可序列化?好吧,当您使用 InProc 时,您的对象存储在内存中。但是,当您使用 SQL 时,需要将它们写入(AKA 序列化)到数据库中。

在代码中:

try {
    Session["MyKey"] = SomeNonSerializableObject
}
catch (Exception e)
{
    ' Suppress all exceptions 
}

我还要确认您的 ASPState 用户(在您的示例中为 mytest)具有他们所需的所有正确权限。测试这一点的简单方法是使它们成为 ASPState 数据库 AND 临时数据库上的 db_owner。如果这解决了问题,那么您就知道这是一个数据库权限问题。

我听到你问为什么 tempdb?好吧,默认情况下,会话状态表将在 tempdb 中创建。

【讨论】:

  • 我的目的不是让我的对象可序列化。我只是希望 Sessions 更加持久。该项目将托管在共享环境中。 IIS 发生任何事情,我的会话都会消失。我没有添加任何 try / catch 块来检索会话。通过使用 aspnet_regsql.exe 工具,我创建了会话状态表并将 proc 存储在我的数据库(自定义)中,这就是我在 web.config 中允许CustomSqlDatabase 的原因
  • 您必须使您的对象可序列化才能将它们存储在数据库中。这就是它的工作原理。
  • 是的,我确实通过包含该属性将我的类标记为可序列化。然而,这无济于事。
  • 您说“我没有添加任何 try / catch 块来检索会话”。但是,我的代码说明问题是设置会话时的 try/catch。您能否确认您在设置会话时没有抑制异常?
猜你喜欢
  • 2019-10-28
  • 2012-12-11
  • 2014-09-17
  • 2019-10-12
  • 1970-01-01
  • 1970-01-01
  • 2012-12-22
  • 2012-01-31
  • 1970-01-01
相关资源
最近更新 更多