【问题标题】:Session variable not updating when using Azure cache使用 Azure 缓存时会话变量未更新
【发布时间】:2012-05-02 12:43:17
【问题描述】:

我编写了托管在 Azure 中的 MVC 3 应用程序。我正在使用会话变量在我的一个长期运行的进程上存储 http 调用之间的更新状态信息。然后使用它来更新进度条。这些值可以很快改变。

当使用 InProc 会话提供程序时,这一切都很好。但是,每当我更改为使用 Azure 缓存会话提供程序时,会话变量都不会从长时间运行的进程中更新。

我现在正在更改东西以直接使用缓存变量,这似乎到目前为止有效。

为什么在缓存中使用Session时下面的方法不起作用,但是InProc很好?

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

Session["OPERATION_PROGRESS"] = 0;

然后我会像这样处理会话

HttpSessionStateBase session = Session;

并将其传递给我的长期运行过程,例如

LongRunningProcess.Go(session);

然后在 LongRunningProcess 方法中,它会在使用传递的会话对象完成任务时更新会话变量。

passedSession["OPERATION_PROGRESS"]=10;

Web 客户端调用一个进度页面,将会话变量值传回以更新进度条。

【问题讨论】:

  • 您是否将 Serializable 对象存储在 Azure 缓存中?你的sessionState/@timeout 是什么?您的会话是否会在您的长时间运行的流程结束之前超时?您应该分享相关的sessionState XML 配置 (AppFabricCacheSessionStoreProvider)。
  • 我只在会话变量中存储字符串和整数类型。该过程间歇性地工作,因此我认为逻辑没有错误,但与提交或缓存或其他导致延迟或未处理/未报告故障的因素有关。

标签: asp.net-mvc-3 session azure session-variables azure-caching


【解决方案1】:

根据我最近阅读的有关会话提供程序的内容,我怀疑正在发生的事情是在初始化长时间运行的请求的请求完成后,会话提供程序释放了它对会话信息的锁定,从而有效地断开了它。来自MSDN

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

仍然有一个对象可供您交谈(这就是为什么您的长时间运行的进程仍然有效),但是对该对象的任何更改都不会发送到持久层(这就是为什么后续请求不会接收这些变化)。

我在类似情况下所做的是在请求开始时生成请求 ID 并在 azure 表中创建一行,并将其作为分区键(但您可以使用任何您喜欢的存储),传递此 ID进入长时间运行的进程,并将此 ID 返回给客户端。长时间运行的过程只是更新表中的这一行。所有后续的进度请求都在此请求 ID 中传递,查找它很简单。为了防止表变得太大,在发现进程完成的请求时,它会删除该行。

如果您要使用 azure 表存储,则对这个系统的改进是使用当前时间滴答作为分区键,并使用另一个唯一 ID 作为行键。这样就可以很容易地找到在表中超过应有时间的行并将其清除。

【讨论】:

  • 非常有趣。我会看看我能不能解决这个问题。谢谢你。
猜你喜欢
  • 2014-07-31
  • 2011-02-08
  • 2018-02-06
  • 1970-01-01
  • 2011-10-09
  • 1970-01-01
  • 1970-01-01
  • 2014-03-18
  • 1970-01-01
相关资源
最近更新 更多