为什么在ASP.NET MVC中使用异步操作和RedirectToAction时会出现新会话?

时间:2013-05-30 13:44:06

标签: asp.net-mvc session async-await

我有一个ASP.NET MVC 4应用程序,它表现出会话管理问题。

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

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

发生的操作是异步操作(使用.NET 4.5中的async / await功能)。我操纵使用await关键字调用的线程中的会话。当await操作完成后,我会执行RedirectToAction以显示操作的结果。

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

我在应用程序的多个点使用RedirectToAction,因此这不是问题(或至少是唯一的问题)。问题可能与async / await调用有关 - 即使我不使用或需要await调用的代码中的会话吗?

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:-1)

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