【发布时间】:2018-03-19 01:26:47
【问题描述】:
我正在使用 Web API 开发一个 MVC 项目。当用户登录时,我正在向 Web 服务发送一个令牌。我将此令牌保存在 MVC 端的 Session 对象中。如果此会话为空,我想从用户再次登录。但有时这个会话对象会被自己删除。这可能是什么原因?
【问题讨论】:
标签: asp.net-mvc asp.net-web-api login token session-cookies
我正在使用 Web API 开发一个 MVC 项目。当用户登录时,我正在向 Web 服务发送一个令牌。我将此令牌保存在 MVC 端的 Session 对象中。如果此会话为空,我想从用户再次登录。但有时这个会话对象会被自己删除。这可能是什么原因?
【问题讨论】:
标签: asp.net-mvc asp.net-web-api login token session-cookies
会话的超时时间为 20 分钟。这可能意味着您的用户在这 20 分钟内没有将任何内容发回服务器。
另一个可能导致会话超时的问题是,如果您通过 Visual Studio 更改 web.config 或其他文件中的某些内容。这将在后台触发编译过程并重置您的会话。
开箱即用的默认会话是InProc 会话。这意味着您的会话与您的 Web 应用程序在同一进程中运行。
如果您想在仍然能够更新 Web 应用程序的同时保留会话,则需要使用 Out of process 或 SQL Server 作为会话存储。 (请注意,这些会话状态并不真正适用于您将在本地更新内容的场景,而是在生产中和/或如果您有一个网络农场,但没有什么能阻止您在本地使用它们。)
此会话模式将使用服务调用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 会话状态触发。
有关更多信息,请查看以下两个链接:
【讨论】: