.net 负载平衡器后面的会话\u结束事件

.net 负载平衡器后面的会话\u结束事件,.net,asp.net,load-balancing,.net,Asp.net,Load Balancing,我正在负载平衡器后面创建web应用程序。到目前为止,我已将其配置为将会话存储在数据库中,但我不确定该如何处理会话过期。问题不是会话没有从数据库中删除,而是会话结束事件,因为我必须在其中调用一些web服务方法 假设会话结束时调用Session_End,我担心的是会话在一台服务器上创建,但在另一台服务器上完成的情况。在这种情况下,恐怕第一台服务器上的会话结束会过早地执行,我会过早地调用web服务。在这种情况下,你有什么建议 编辑: 我记得不久前读过关于Sql代理对会话结束事件做出反应,然后执行自定义

我正在负载平衡器后面创建web应用程序。到目前为止,我已将其配置为将会话存储在数据库中,但我不确定该如何处理会话过期。问题不是会话没有从数据库中删除,而是会话结束事件,因为我必须在其中调用一些web服务方法

假设会话结束时调用Session_End,我担心的是会话在一台服务器上创建,但在另一台服务器上完成的情况。在这种情况下,恐怕第一台服务器上的会话结束会过早地执行,我会过早地调用web服务。在这种情况下,你有什么建议

编辑:
我记得不久前读过关于Sql代理对会话结束事件做出反应,然后执行自定义代码的文章。有人能确认这个解决方案是可行的吗?

这不正是您在数据库中存储会话信息的原因吗

这解决了“会话在哪个服务器上”的问题


如下所述,只为inProc会话调用会话结束,您不会使用它。

除非您使用进程内会话状态,否则不支持会话结束事件。你可以看看StateServer。我考虑这是为了我自己的环境。它实现分布式会话状态并支持会话结束事件

编辑以添加更多信息:


他们的网站更好地解释了这一点,我可以(),但这里是一个简短的总结。ScaleOut(或类似的小工具)使用分布式缓存来管理会话状态。这意味着每个服务器上的进程都保存会话数据。这些进程在服务器之间进行通信,以便在所有服务器之间共享所有数据—无论哪个服务器碰巧正在处理用户请求,都可以使用相同的会话数据。如果您的一台服务器出现故障,则会保留所有会话数据,因为它分布在所有服务器上。相比之下,asp.net提供的进程内会话状态只能在单个服务器上工作,会话状态服务器在单独的单个服务器上保存会话数据(单点故障),或者sql server会话状态非常健壮,但会影响性能。

是的,但我担心的是。。。例如(超时=10分钟):用户在服务器A上打开页面,9分钟后负载平衡器切换到服务器B。通过阅读文档和博客,我了解到会话结束将在服务器A上创建会话10分钟后和服务器B上19分钟后调用,因为超时计时器不知道其他服务器,并且该会话已扩展。若我错了,请纠正我。我怀疑在项目接近尾声的时候,我能不能把这件事推给管理层。目前我只有一个选择,那就是使用Sql Server。如果问题是部署延迟,我相信这个产品很容易安装和配置,并且只需要对代码进行很少的更改(但是,因为我自己还没有安装它,我可能会很差)。如果问题是成本,那么…任何支持这个答案的人都可以解释扩大的好处吗?