我正在负载均衡器后面创建Web应用程序。到目前为止,我将其配置为在数据库中存储会话,但我不确定如何处理会话到期。问题不是会话没有从数据库中删除而是Session_End事件,因为我必须在其中调用一些Web服务方法。
假设Session_End在到期时被调用,我害怕的是在一台服务器上创建会话但在另一台服务器上完成会话的情况。在这种情况下,我担心第一台服务器上的Session_End会过早地执行,我会过早地调用Web服务。在这种情况下你会建议什么?
我记得前一段时间阅读Sql Agent对会话结束事件的反应,然后执行自定义代码。任何人都可以确认这个解决方案是否可行?
答案 0 :(得分:2)
除非您正在使用进程内会话状态,否则不支持会话结束事件。您可以查看ScaleOut Software StateServer。我正在为自己的环境考虑这个问题。它实现分布式会话状态并支持会话结束事件。
修改以添加更多信息:
他们的网站更好地解释了我(details page),但这里有一个快速摘要。 ScaleOut(或类似的小工具)使用分布式缓存来管理会话状态。这意味着每个服务器上的进程都会保存会话数据。这些进程在服务器之间进行通信,以便所有数据在所有服务器之间共享 - 无论哪个服务器正在处理用户请求,相同的会话数据都可用。如果您的某个服务器发生故障,则会保留所有会话数据,因为它分布在所有服务器上。相比之下,asp.net提供的进程内会话状态仅适用于单个服务器,会话状态服务器将会话数据保存在单独的单个服务器(单点故障)或sql server会话状态,这是相当的健壮,但会伤害表现。
答案 1 :(得分:0)
这不正是您在数据库中存储会话信息的原因吗?
这解决了“哪个服务器是会话的问题。”
如下所述,Session_End仅用于inProc会话,您将不会使用它。