"Accessing expired session" 来自 ASP.Net Core 中 DistributedSession 的异常
"Accessing expired session" exception from DistributedSession in ASP.Net Core
我有一个 .Net Core 3.1 Web 应用程序,但我不断收到来自“Microsoft.AspNetCore.Session.DistributedSession”的“访问过期会话”异常,这会阻止我的网站加载。
重现步骤:
- 成功导航到网站,该网站使用浏览器缓存会话 cookie
- 重启网络服务器,清除内存中的会话缓存
- 刷新浏览器,尝试重新使用之前缓存的会话 cookie
此时异常只会加载我的日志,直到网络服务器崩溃。让它停止的唯一方法是清除浏览器中的会话 cookie,这将允许它生成新的会话 cookie。
为什么我使用 AddDistributedMemoryCache 和 AddSession 启用的会话机制在使用旧 cookie 获取此请求时不只是创建一个新会话?如果我能在某个地方捕获异常,也许我可以在我的代码中处理它,但我什至不知道如何捕获异常。谁能提供一种无需手动删除浏览器 cookie 即可防止此错误的方法?
附加信息:
我找到了它的源代码,显然,它实际上不是错误,但它阻止了我的页面呈现,并且由于内存不足异常而使我的网络服务器崩溃,因为它记录了消息 1000 次。关于如何解决这个问题有什么建议吗?
经过几个月的深入研究这个问题,我终于发现了是怎么回事。我已经编写了一个自定义 ILoggerProvider,以便我可以控制如何记录通过 ILoggerFactory 的事情。在我的 ILoggerProvider 中,我的代码引用了 Session。每次引用那个Session的时候,微软的代码都会在日志中再写入一条“Accessing expired session”的信息,从而触发我的代码,访问Session等等,造成死循环。现在,我只需要重构我的 ILoggerProvider 使其足够智能以避免导致无限循环。
我有一个 .Net Core 3.1 Web 应用程序,但我不断收到来自“Microsoft.AspNetCore.Session.DistributedSession”的“访问过期会话”异常,这会阻止我的网站加载。
重现步骤:
- 成功导航到网站,该网站使用浏览器缓存会话 cookie
- 重启网络服务器,清除内存中的会话缓存
- 刷新浏览器,尝试重新使用之前缓存的会话 cookie
此时异常只会加载我的日志,直到网络服务器崩溃。让它停止的唯一方法是清除浏览器中的会话 cookie,这将允许它生成新的会话 cookie。
为什么我使用 AddDistributedMemoryCache 和 AddSession 启用的会话机制在使用旧 cookie 获取此请求时不只是创建一个新会话?如果我能在某个地方捕获异常,也许我可以在我的代码中处理它,但我什至不知道如何捕获异常。谁能提供一种无需手动删除浏览器 cookie 即可防止此错误的方法?
附加信息: 我找到了它的源代码,显然,它实际上不是错误,但它阻止了我的页面呈现,并且由于内存不足异常而使我的网络服务器崩溃,因为它记录了消息 1000 次。关于如何解决这个问题有什么建议吗?
经过几个月的深入研究这个问题,我终于发现了是怎么回事。我已经编写了一个自定义 ILoggerProvider,以便我可以控制如何记录通过 ILoggerFactory 的事情。在我的 ILoggerProvider 中,我的代码引用了 Session。每次引用那个Session的时候,微软的代码都会在日志中再写入一条“Accessing expired session”的信息,从而触发我的代码,访问Session等等,造成死循环。现在,我只需要重构我的 ILoggerProvider 使其足够智能以避免导致无限循环。