使用Azure的缓存时Session变量没有更新(Session variable not upda

2019-09-16 23:26发布

我已经编写Azure中托管的MVC 3应用程序。 我使用Session变量来对我的长期运行过程中的一个HTTP调用中间存储更新状态信息。 这随后被用于更新进度条。 该值可以非常迅速改变。

使用InProc会话提供商时,这一切的伟大工程。 然而,每当我改变使用Azure的缓存会话提供会话变量不从长时间运行的进程更新。

我现在改变的东西直接使用缓存的变量,这似乎工作至今。

为什么下面的方法不在缓存中使用Session时的工作,但罚款是InProc?

例如,我设置可能会启动一个会话变量在一个控制器的ActionResult

Session["OPERATION_PROGRESS"] = 0;

然后我得到一个手柄上的会话状

HttpSessionStateBase session = Session;

并将它传递给我的长期运行的过程是怎样的

LongRunningProcess.Go(session);

然后从LongRunningProcess方法中,因为它使用传递会话对象行进通过其任务是将更新会话变量。

passedSession["OPERATION_PROGRESS"]=10;

该网客户端调用传递会话变量值回更新进度条的进度页面。

Answer 1:

根据我一直在阅读有关会议提供商最近我怀疑是正在发生的事情是,在这之后初始化长时间运行的请求的请求完成后,会话提供释放其对会话信息锁,有效地断开连接。 从MSDN :

在请求结束时,如果会话状态值已被修改,SessionStateModule实例调用,以更新的值写入到会话状态存储的SessionStateStoreProviderBase.SetAndReleaseItemExclusive方法。

目前仍然是一个对象,你交谈(这就是为什么你的长期运行的进程仍然有效),但没有改变该对象被发送到持久层(这就是为什么后续请求不拿起这些变化)。

我已经在类似情况下所做的是对请求的开始生成请求ID和一个蓝色的表中创建一行,作为分区键(但你可以使用任何你喜欢的存储),通过这个ID在长正在运行的进程,并返回此ID给客户端。 在长时间运行的进程刚刚更新表格此一行。 对于正在进行的所有后续请求传递这个请求ID,它的琐碎来关注一下吧。 要过于庞大,对发现的过程中请求停止表完成后,会删除该行。

而这个系统,如果你要使用Azure Table中存储的改进是使用当前时间为蜱分区键和另一唯一的ID作为行键。 这样,它会很容易地发现,已经在该表的时间比他们应该和清理出来行。



文章来源: Session variable not updating when using Azure cache