【发布时间】:2013-05-30 13:44:05
【问题描述】:
我有一个出现会话管理问题的 ASP.NET MVC 4 应用程序。
我正在使用 Session 来跟踪登录的用户。我有一个自定义操作过滤器,用于检查用户是否已登录,如果没有,则重定向到登录页面。
这个一般可以正常工作。但是,我遇到了一个问题,即在某个请求期间创建了一个新会话。会话 ID 相同,但 Session.IsNewSession 属性显示它是一个新会话 - 并且会话内容已经消失。
发生的操作是异步操作(使用 .NET 4.5 中的 async/await 功能)。我不在使用 await 关键字调用的线程中操作会话。当 await 操作完成后,我会执行 RedirectToAction 来显示操作的结果。
当我检查会话时,就在执行我已将其重定向到的操作之前 - 它具有自定义访问属性 - 这就是我发现已创建新会话的时候(因此身份验证失败并且我返回到登录页面)。
我在应用程序的许多地方都使用了 RedirectToAction,所以这不是问题(或至少是唯一问题)。问题是否与 async/await 调用有关——即使我不使用或不需要在 await 调用的代码中的会话?
是否将 ASP.NET 线程返回到池中并使其返回使会话无效?如果是这样,解决方案是什么?我可以在等待期间保存和恢复会话吗?或者我是否必须实现一些自定义逻辑来记录用户登录到我的数据库?
【问题讨论】:
-
服务器端代码中的异步?这是糟糕的情况。
-
async不应导致会话问题。你在用ConfigureAwait(false)吗?你能发布一个最小的复制吗? -
@GrantThomas 自 ASP.NET 1.0 起支持异步 HTTP 处理程序,自 ASP.NET 2.0 起支持页面的异步页面任务。随着 async**/**await 的引入,ASP.NET 在 HTTP 处理程序、Web 表单页面和 MVC 控制器中受益匪浅。而且由于请求处理线程池是一种稀缺资源,因此它可能是一个非常好的主意。
-
@PauloMorgado:我相信它实际上是 .NET 1.1。不管怎样,服务器端的异步代码肯定不是新鲜事! :)
标签: asp.net-mvc session async-await