1

我有一个显示会话管理问题的 ASP.NET MVC 4 应用程序。

我正在使用 Session 来跟踪登录的用户。我有一个自定义操作过滤器,用于检查用户是否已登录,如果没有,则重定向到登录页面。

通常工作正常。但是,我遇到了一个问题,即在某个请求期间创建了一个新会话。会话 ID 相同,但 Session.IsNewSession 属性显示它是一个新会话 - 并且会话内容已经消失。

发生的操作是异步操作(使用 .NET 4.5 中的 async/await 功能)。我不会在使用 await 关键字调用的线程中操作会话。当等待操作完成时,我会执行一个 RedirectToAction 来显示操作的结果。

当我检查会话时,就在执行我已将其重定向到的操作之前-它具有自定义访问属性-这就是我发现已创建新会话的时候(因此身份验证失败,我将返回登录页)。

我在应用程序的许多地方都使用了 RedirectToAction,所以这不是问题(或至少是唯一的问题)。问题是否与 async/await 调用有关——即使我在 await 调用的代码中不使用或不需要会话?

是否将 ASP.NET 线程返回到池中并使其返回使会话无效?如果是这样,解决方案是什么?我可以在等待期间保存和恢复会话吗?或者我是否必须实现一些自定义逻辑来记录用户登录到我的数据库,例如?

4

2 回答 2

1

事实证明,问题是由我正在使用的 Win32 DLL 引起的,该 DLL “触摸”(即更改时间戳)配置文件。这导致网络应用程序在此时重新加载 - 从而使会话无效。

于 2013-06-06T19:33:56.867 回答
-1

当 Visual Studio Professional 2017 顶部的绿色箭头设置为“IIS Express”时,我得到了这种行为。当我将其更改为“IIS Express (Google Chrome)”时,每次调用 RedirectToAction 时,我的会话变量都会消失。我在其中一篇文章中读到它可能与浏览器 cookie 有关。

于 2019-03-07T22:41:56.087 回答