我有一个显示会话管理问题的 ASP.NET MVC 4 应用程序。
我正在使用 Session 来跟踪登录的用户。我有一个自定义操作过滤器,用于检查用户是否已登录,如果没有,则重定向到登录页面。
这通常工作正常。但是,我遇到了一个问题,即在某个请求期间创建了一个新会话。会话 ID 相同,但 Session.IsNewSession 属性显示它是一个新会话 - 并且会话内容已经消失。
发生的操作是异步操作(使用 .NET 4.5 中的 async/await 功能)。我不会在使用 await 关键字调用的线程中操作会话。当等待操作完成时,我会执行一个 RedirectToAction 来显示操作的结果。
当我检查会话时,就在执行我已将其重定向到的操作之前-它具有自定义访问属性-这就是我发现已创建新会话的时候(因此身份验证失败,我将返回登录页)。
我在应用程序的许多地方都使用了 RedirectToAction,所以这不是问题(或至少是唯一的问题)。问题是否与 async/await 调用有关——即使我在 await 调用的代码中不使用或不需要会话?
是否将 ASP.NET 线程返回到池中并使其返回使会话无效?如果是这样,解决方案是什么?我可以在等待期间保存和恢复会话吗?或者我是否必须实现一些自定义逻辑来记录用户登录到我的数据库,例如?