Redis支持的会话状态未能完全保存

3
我们正尝试从服务器会话(IIS)迁移到基于Redis的会话。我已经在web.config中更新了自定义sessionState配置。我发现只有一些键/值对被保存。我期望其中有5个,但实际只有2个。我验证了所有代码最终都会命中HttpContext.Current.Session.Add。我验证了我的POCO标记为可序列化。查看监视时,我发现它添加了前两个键值对,然后之后的所有内容都没有保存。没有命中、拒绝或异常。什么也没有。
有人见过这种情况吗?知道我可以从哪里开始解决吗?
谢谢, Matt
更新1:我已经切换到使用JSON序列化器来存储我的数据。同样的问题。似乎不是一个序列化问题。
更新2:我现在已经下载了源代码,编译并调试它。方法SetAndReleaseItemExclusive,似乎将会话项发送到Redis,只被命中一次,尽管我的网站处理SSO并在页面之间跳转以加载用户等等,应该会被多次命中。必须调查为什么只触发一次...

没有被保存的重要内容是我的“authenticatedUser”对象,它保存了他们的ID和我需要在应用程序中使用的其他信息。幸运的是,保存到会话的机制是接口化的,所以我能够使用一个直接与Redis通信而不是通过会话的实现。这个方法完美地工作。就像会话状态没有刷新到Redis一样? - Matt M
什么代码?在这里需要更多的上下文。“我的Redis不工作”不是足够详细的技术解释。请记住,Redis有MONITOR语句,因此您可以查看运行的命令(如果有),并使用它来调查Redis是否实际被使用。 - tadman
感谢@tadman。我不会粘贴我的整个代码库。我想说的是,我验证了代码是否命中HttpContext.Current.Session.Add,这足以说明“是的,已验证数据已添加到会话中。”我还说“查看监视,我看到……”然后继续陈述我所看到的。正如我所说,除了前两个键对(我期望的5个键对之一)之外,没有其他内容。如果您有更具体的问题... - Matt M
如果您把那一大段话分成更小、更易于理解的段落,会更有帮助。"监控"可以指任何东西(如Windows事件查看器等),因此请尽量具体化,并且在可能的情况下,使用代码或实际输出来描述,而不是模糊的描述。 - tadman
@tadman,您是否知道在使用AJAX调用时此设置存在任何问题?根据我的更新2,我发现在AJAX调用结束时未触发SetAndReleaseItemExclusive。 - Matt M
1个回答

1
我找到了解决方法。原来,我的MVC应用程序外的AJAX请求到一个“API”端点时没有正确的会话状态附加。因此,SetAndReleaseItemExclusive从未被调用。添加以下内容即可解决问题:
protected void Application_PostAuthorizeRequest()
    {
        if (HttpContext.Current.Request.Url.LocalPath == "/api/user/load")
            HttpContext.Current.SetSessionStateBehavior(System.Web.SessionState.SessionStateBehavior.Required);
        else
            HttpContext.Current.SetSessionStateBehavior(System.Web.SessionState.SessionStateBehavior.ReadOnly);
    }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接