我正在使用Web API开发MVC项目。当用户登录时,我正在向Web服务发送令牌。我将此标记保存在MVC端的Session对象中。如果此会话为null,我想再次从用户登录。但有时这个会话对象会被自己删除。这可能是什么原因?
答案 0 :(得分:0)
会话的超时时间为20分钟。这可能意味着您的用户在这20分钟内没有将任何内容发回服务器。
可能导致会话超时的另一个问题是,例如,如果您通过Visual Studio更改了web.config
或其他某些文件中的内容。这将在后台触发编译过程并重置您的会话。
开箱即用的默认会话是InProc
会话。这意味着您的会话在与Web应用程序相同的过程中运行。
如果要在仍能够更新Web应用程序的同时保留会话,则需要使用Out of process
或SQL Server
作为会话存储。 (请注意,这些会话状态并不适用于您将在本地更新内容的情况,而是在生产中和/或如果您有Web场时,但没有任何东西阻止您在本地使用它们。)
此会话模式将使用服务调用ASP.NET State Service
。此服务设置为手动。您首先需要打开服务(单击开始 - >运行 - > services.msc)。找到上述服务,双击并将启动更改为Automatic
,然后Start
。
在web.config
中,您需要在<system.web>
下更新或添加(如果不存在)以下密钥:
<sessionState mode="StateServer"
stateConnectionString="tcpip=YourComputerNameGoesHere:42424"
cookieless="false"
timeout="20"/>
将超时value
更新为适合您的任何内容。
SQL Server状态允许您将会话存储在服务器上的指定数据库中。您必须记住的一件事是,这是所有人中最慢的选择,因为它必须从服务器传送到服务器(在您的情况下,它可能是相同的服务器,但如果您将Web应用程序和SQL服务器分开,请记住这一点)
要配置SQLServer状态,您必须执行几个额外步骤。首先,将配置添加到web.config
:
<sessionState mode="SQLServer"
sqlConnectionString="Integrated Security=SSPI;data source=MySqlServerForSessions;" />
(我现在不记得你是否可以更改数据库的名称,但现在使用默认值。)
下一步是从命令提示符运行aspnet_regsql
命令。此命令应该在您的C:\Windows\Microsoft.NET\Framework\vX.Y.ZZZZ
中(其中X.Y.ZZZZ是.NET Framework的版本。尝试使用您拥有的最高版本):
aspnet_regsql.exe -S MySqlServerForSessions -E -ssadd -sstype p
这将创建一个存储会话的新数据库。如果您有SQLExpress,则在运行此命令时可能会遇到问题。为此你需要运行:
EXECUTE sp_configure 'show advanced options', 1
RECONFIGURE WITH OVERRIDE
GO
EXECUTE sp_configure 'Agent XPs', 1
RECONFIGURE WITH OVERRIDE
GO
EXECUTE sp_configure 'show advanced options', 0
RECONFIGURE WITH OVERRIDE
GO
这可以帮助您使用会话。需要记住的一点是,在global.asax
中,当您使用StateServer
或SQLServer
时,您无法使用Session_End事件。此事件仅触发InProc
会话状态。
有关详细信息,请查看以下两个链接: