【问题标题】:Why am I getting a new session when using async actions and RedirectToAction in ASP.NET MVC?为什么在 ASP.NET MVC 中使用异步操作和 RedirectToAction 时会出现新会话?
【发布时间】: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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2014-05-15
      • 2010-09-28
      • 2020-04-19
      • 1970-01-01
      • 2017-05-02
      • 1970-01-01
      • 2014-12-15
      • 1970-01-01
      • 2019-03-08
      相关资源
      最近更新 更多