使用Azure缓存时会话变量不更新
我编写了一个在Azure中托管的MVC 3应用程序。我正在使用会话变量来在我长时间运行的进程之一的http调用之间存储更新状态信息。然后这用于更新进度条。这些值可能会变化很快。使用Azure缓存时会话变量不更新
使用InProc会话提供程序时,这一切都很好。但是,无论何时我更改为使用Azure缓存会话提供程序,会话变量都不会从长时间运行的进程中更新。
我现在正在改变东西直接使用Cache变量,这似乎工作到目前为止。
为什么在缓存中使用Session时以下方法不起作用,但罚款InProc?
例如,我设置可能会启动一个会话变量在一个控制器的ActionResult
Session["OPERATION_PROGRESS"] = 0;
然后我得到的会话处理类似
HttpSessionStateBase session = Session;
,并把它传递给我的长期运行的过程是怎样的
LongRunningProcess.Go(session);
然后从LongRunningProcess方法中它将更新当会话变量使用传递的会话对象通过其任务进行时。
passedSession["OPERATION_PROGRESS"]=10;
网页客户端调用一个进度页面,该页面传递会话变量值以更新进度条。
根据我最近一直在阅读的有关会话提供者的信息,我怀疑发生了什么事情是,在初始化长时间运行请求的请求完成后,会话提供者释放对会话信息的锁定,从而有效地断开它。从MSDN:
在请求结束时,如果会话状态值已经 修改,SessionStateModule实例调用 SessionStateStoreProviderBase.SetAndReleaseItemExclusive方法 写入更新值到会话状态存储。
仍然有一个对象要与你交谈(这就是为什么你的长时间运行的过程仍然有效),但没有任何对该对象的更改发送到持久层(这就是为什么后续请求不会拿起这些变化)。
我在类似情况下所做的工作就是在请求的开始处生成一个请求ID并在一个天蓝色的表格中创建一行作为分区键(但您可以使用任何你喜欢的存储),通过这个ID放入长时间运行的进程中,并将此ID返回给客户端。长时间运行的过程只是更新表中的这一行。所有随后的进度请求都会传递给此请求ID,查找它很简单。要停止表变得太大,在发现进程完成的请求上删除该行。
如果您打算使用天蓝色表格存储,则对此系统的改进是将当前时间以滴答作为分区键和另一个唯一ID用作行键。这样就很容易找到已经在表中的行比他们应该清理的时间长。
非常有趣。我会看看我是否可以解决这个问题。感谢那。 – NER1808
你是否在Azure Cache中存储['Serializable''](http://msdn.microsoft.com/en-us/library/system.serializableattribute.aspx)对象?什么是你的['sessionState/@ timeout'](http://msdn.microsoft.com/en-us/library/system.web.sessionstate.httpsessionstate.timeout.aspx)?在长时间运行过程结束之前,您的会话是否会超时?你应该分享相关的'sessionState' XML配置(* AppFabricCacheSessionStoreProvider *)。 – SliverNinja
我只在会话变量中存储字符串和int类型。这个过程偶尔会工作,所以我不认为这个逻辑是错的,而是与提交或缓存或其他导致延迟或未处理/未报告失败的因素有关。 – NER1808