是否有必要创建ASP.NET 4.0 SQL会话状态数据库,与现有的ASP.NET 2.0 ASPState DB不同?

Chr*_*Rea 16 sql-server asp.net session-state .net-4.0 asp.net-4.0

ASP.NET 4.0 SQL会话状态机制是否与会话状态的ASP.NET 2.0架构向后兼容,还是应该/我们必须为ASP.NET 4.0应用程序创建一个单独且不同的会话状态数据库?

无论如何我倾向于后者,但2.0数据库似乎只是工作,但我想知道在2.0和4.0版本的ASP.NET之间ASPState数据库模式/过程之间是否存在任何实质性差异.谢谢.

Chr*_*Rea 24

任何人都没有快速回答,所以我做了一些挖掘.我ASPState使用aspnet_regsql.exe.NET 2.0中的工具生成了一个数据库,然后我使用相同的工具但是从.NET 4.0做了同样的事情.然后,我从每个生成的SQL Server数据库生成脚本,并使用比较工具来隔离差异.

我发现: 从.NET 2.0到.NET 4.0版本ASPState架构之间唯一的重要区别是dbo.DeleteExpiredSessions存储过程. 这是由工具安装的SQL Server代理预定作业定期调用的存储过程.

因此,似乎ASPState 2.0和ASPState 4.0的架构完全兼容,因此从技术角度来看,不必隔离ASP.NET 2.0和ASP.NET 4.0会话状态 - 但我仍然可能会这样做.

(这个发现有点令人惊讶,因为ASPState从.NET 1.1变为.NET 2.0.)

每个版本的更改存储过程的详细信息:

.NET 2.0 ASPState DeleteExpiredSessions存储过程:

CREATE PROCEDURE dbo.DeleteExpiredSessions
AS
    DECLARE @now datetime
    SET @now = GETUTCDATE()

    DELETE [ASPState].dbo.ASPStateTempSessions
    WHERE Expires < @now

    RETURN 0   
GO
Run Code Online (Sandbox Code Playgroud)

.NET 4.0 ASPState DeleteExpiredSessions存储过程:

CREATE PROCEDURE dbo.DeleteExpiredSessions
AS
    SET NOCOUNT ON
    SET DEADLOCK_PRIORITY LOW 
    DECLARE @now datetime
    SET @now = GETUTCDATE() 
    CREATE TABLE #tblExpiredSessions 
    ( 
        SessionID nvarchar(88) NOT NULL PRIMARY KEY
    )
    INSERT #tblExpiredSessions (SessionID)
        SELECT SessionID
        FROM [ASPState].dbo.ASPStateTempSessions WITH (READUNCOMMITTED)
        WHERE Expires < @now
    IF @@ROWCOUNT <> 0 
    BEGIN 
        DECLARE ExpiredSessionCursor CURSOR LOCAL FORWARD_ONLY READ_ONLY
        FOR SELECT SessionID FROM #tblExpiredSessions 
        DECLARE @SessionID nvarchar(88)
        OPEN ExpiredSessionCursor
        FETCH NEXT FROM ExpiredSessionCursor INTO @SessionID
        WHILE @@FETCH_STATUS = 0 
            BEGIN
                DELETE FROM [ASPState].dbo.ASPStateTempSessions WHERE
                    SessionID = @SessionID AND Expires < @now
                FETCH NEXT FROM ExpiredSessionCursor INTO @SessionID
            END
        CLOSE ExpiredSessionCursor
        DEALLOCATE ExpiredSessionCursor
    END 
    DROP TABLE #tblExpiredSessions
RETURN 0     
GO
Run Code Online (Sandbox Code Playgroud)

至于为何需要进行上述更改,我发现以下MSDN博客帖子:

摘录,参考旧程序:

...
这将删除所有过期记录上的锁定,并且这些锁定可以提升为页面锁定.当标记为删除的记录数增加时,这会导致与其他"会话状态写入语句"发生死锁.默认情况下,此存储过程应该每分钟运行一次. ...

因此,对于ASP.NET 2.0应用程序,也可以建议使用较新版本的存储过程.

我从博客文章中了解到的另一件事我不知道:ASP.NET 4.0会话状态机制现在提供压缩.compressionEnabledsessionState元素上搜索(ASP.NET设置架构).


最后,我还在ASP.NET并排执行概述中找到了与Microsoft相关的内容.摘抄:

...
如果使用SQL Server来管理会话状态,则安装在同一台计算机上的所有ASP.NET(.NET Framework)版本都可以共享使用最新版本的ASP.NET安装的SQL状态服务器.会话状态的模式在所有ASP.NET版本中都是相同的.

(尽管在实现方面存在一些不同于模式的差异.)

  • 谢谢你发布你的答案!它帮助我们找到了解决方案.对于其他任何有问题的人来说,这是$ KB:http://support.microsoft.com/kb/973849 (2认同)