Asp.net mvc 3 使用Azure缓存时未更新会话变量

Asp.net mvc 3 使用Azure缓存时未更新会话变量,asp.net-mvc-3,session,azure,session-variables,azure-caching,Asp.net Mvc 3,Session,Azure,Session Variables,Azure Caching,我已经编写了一个托管在Azure中的MVC 3应用程序。我正在使用会话变量在一个长时间运行的进程上的http调用之间存储更新状态信息。然后,这将用于更新进度条。这些值的变化非常快 当使用InProc会话提供程序时,这一切都非常有效。但是,每当我更改为使用Azure缓存会话提供程序时,会话变量不会从长时间运行的进程中得到更新 我现在正在改变一些事情,直接使用缓存变量,到目前为止这似乎是可行的 为什么在缓存中使用Session时,下面的方法不起作用,但在proc中却很好 例如,我设置可能在一个控制器

我已经编写了一个托管在Azure中的MVC 3应用程序。我正在使用会话变量在一个长时间运行的进程上的http调用之间存储更新状态信息。然后,这将用于更新进度条。这些值的变化非常快

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

我现在正在改变一些事情,直接使用缓存变量,到目前为止这似乎是可行的

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

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

Session["OPERATION_PROGRESS"] = 0;
然后我会处理这个会话,比如

HttpSessionStateBase session = Session;
并将其传递给我的长期运行流程,如

LongRunningProcess.Go(session);
然后,在LongRunningProcess方法中,它将在使用传递的会话对象完成任务时更新会话变量

passedSession["OPERATION_PROGRESS"]=10;

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

根据我最近阅读的有关会话提供程序的内容,我怀疑发生的情况是,初始化长时间运行的请求的请求完成后,会话提供程序将释放对会话信息的锁定,从而有效地断开会话信息的连接。发件人:

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

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

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


如果您要使用azure表存储,那么对该系统的改进是使用当前时间(以记号为单位)作为分区键,使用另一个唯一ID作为行键。通过这种方式,可以很容易地找到表中存在的行的时间超过了它们应该存在的时间,并将其清除。

您是否将对象存储在Azure缓存中?你的爱好是什么?在长时间运行的进程结束之前,会话是否会超时?您应该共享相关的
sessionState
XML配置(AppFabricCacheSessionStoreProvider)。我只在会话变量中存储字符串和int类型。这个过程是间歇工作的,所以我不认为逻辑是错误的,但与提交或缓存或其他导致延迟或未处理/未报告失败的因素有关。非常有趣。我会看看我是否能解决这个问题。谢谢你。