我有一个ASP.NET MVC 4应用程序,它表现出会话管理问题。
我正在使用会话来跟踪登录用户。我有一个自定义操作过滤器,用于检查用户是否已登录,如果没有,则重定向到登录页面。
此通常正常工作。但是,我遇到了在某个请求期间创建新会话的问题。会话ID是相同的,但Session.IsNewSession属性显示它是一个新会话 - 会话内容已经消失。
发生的操作是异步操作(使用.NET 4.5中的async / await功能)。我不操纵使用await关键字调用的线程中的会话。当await操作完成后,我会执行RedirectToAction以显示操作的结果。
当我检查会话时,就在执行我已将其重定向到的操作之前 - 它上面有自定义访问属性 - 当我发现已创建新会话时(因此身份验证失败并且我返回到登录页面。)
我在应用程序的多个点使用RedirectToAction,因此这不是问题(或至少是唯一的问题)。问题可能与async / await调用有关 - 即使我不使用或需要await调用的代码中的会话吗?
是否将ASP.NET线程返回到池并将其恢复为使会话无效?如果是这样,解决方案是什么?我可以在整个等待中保存和恢复会话吗?或者我是否必须实现一些记录用户登录数据库的自定义逻辑,例如?
答案 0 :(得分:1)
事实证明,问题是由我正在使用的Win32 DLL引起的,它正在“触摸”(即更改时间戳)配置文件。这导致Web应用程序在此时重新加载 - 从而使会话无效。
答案 1 :(得分:-1)
当Visual Studio Professional 2017顶部的绿色箭头设置为“ IIS Express”时,出现了此行为。当我将其更改为“ IIS Express(Google Chrome)”时,每次我调用RedirectToAction时,会话变量都会消失。我读过其中一篇文章,它可能与浏览器Cookie有关。