Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/asp.net/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否需要创建ASP.NET 4.0 SQL会话状态数据库,与现有ASP.NET 2.0 ASPState DB不同?_Asp.net_Sql Server_.net 4.0_Session State_Asp.net 4.0 - Fatal编程技术网

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

是否需要创建ASP.NET 4.0 SQL会话状态数据库,与现有ASP.NET 2.0 ASPState DB不同?,asp.net,sql-server,.net-4.0,session-state,asp.net-4.0,Asp.net,Sql Server,.net 4.0,Session State,Asp.net 4.0,ASP.NET 4.0SQL会话状态机制是否与会话状态的ASP.NET 2.0模式向后兼容,或者我们是否应该/必须为我们的ASP.NET 4.0应用程序创建一个单独且不同的会话状态数据库 无论如何,我倾向于后者,但是2.0数据库似乎可以正常工作,尽管我想知道ASP.NET的2.0和4.0版本之间的ASPState数据库模式/过程是否有实质性的区别。谢谢。没有任何人能快速回答这个问题,所以我做了一些挖掘。我使用.NET 2.0中的aspnet_regsql.exe工具生成了一个ASPState数据

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


无论如何,我倾向于后者,但是2.0数据库似乎可以正常工作,尽管我想知道ASP.NET的2.0和4.0版本之间的ASPState数据库模式/过程是否有实质性的区别。谢谢。

没有任何人能快速回答这个问题,所以我做了一些挖掘。我使用.NET 2.0中的
aspnet_regsql.exe
工具生成了一个
ASPState
数据库,然后我使用相同的工具,但从.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存储过程:
创建过程dbo.DeleteExpiredSessions
作为
声明@now datetime
SET@now=GETUTCDATE()
删除[ASPState].dbo.ASPStateTempSessions
现在在哪里
返回0
去
.NET 4.0 ASPState DeleteExpiredSessions存储过程:
创建过程dbo.DeleteExpiredSessions
作为
不计较
将死锁设置为低优先级
声明@now datetime
SET@now=GETUTCDATE()
创建表#tblExpiredSessions
( 
SessionID nvarchar(88)主键不为空
)
插入#tblExpiredSessions(SessionID)
选择SessionID
来自[ASPState].dbo.ASPStateTempSessions与(READUNCOMMITTED)
现在在哪里
如果@@ROWCOUNT 0
开始
声明ExpiredSessionCursor游标本地转发只读
对于从#tblExpiredSessions中选择SessionID
声明@SessionID nvarchar(88)
打开过期的sessioncursor
从ExpiredSessionCursor获取下一个到@SessionID
而@@FETCH\u STATUS=0
开始
从[ASPState].dbo.ASPStateTempSessions中删除,其中
SessionID=@SessionID和Expires<@现在
从ExpiredSessionCursor获取下一个到@SessionID
结束
关闭过期的sessioncursor
取消分配过期的SessionCursor
结束
DROP TABLE#tblExpiredSessions
返回0
去
至于为什么需要进行上述更改,我发现了以下MSDN博客帖子:

关于旧程序的摘录:


这会把所有的锁都锁上 已过期的记录将被删除和删除 这些锁可以升级到第页 锁。这可能会导致死锁 使用其他“会话状态写入” 语句“当记录数 标记为删除增加。通过 默认情况下,此存储过程为 应该每分钟跑一次。

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

从博客文章中我还学到了一件我不知道的事情:ASP.NET 4.0会话状态机制现在提供了压缩功能。搜索
compressionEnabled
at


最后,我还从微软网站上找到了一些相关信息。摘录:


如果使用SQL Server来管理 会话状态,ASP.NET的所有版本 (指.NET Framework)是 安装在同一台计算机上可以 共享正在运行的SQL state server 已安装最新版本的 ASP.NET会话状态的模式 在的所有版本中都是相同的 ASP.NET。


(虽然在实现上存在一些不同,但并不特定于模式。)

感谢您发布您的答案!它帮助我们找到了解决办法。对于任何其他有此问题的人,这里是m$KB:
CREATE PROCEDURE dbo.DeleteExpiredSessions
AS
    DECLARE @now datetime
    SET @now = GETUTCDATE()

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

    RETURN 0   
GO
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