【发布时间】:2013-05-27 22:06:11
【问题描述】:
我们正在尝试更改 Azure 中的 ASP.NET 会话状态超时,并注意到 ASP.NET 会话过期方式与命名缓存设置之间存在脱节。更改 Azure 的自定义会话状态提供程序的 web.config sessionState 超时属性就足够了,还是我们需要更改服务配置中的命名缓存设置以影响会话超时?
根据 MSDN,HttpSessionState.Timeout 属性是会话状态提供程序终止会话之前请求之间允许的时间量(以分钟为单位)。这意味着在每个带有其 SessionID 的请求之后,所有 Session 对象都会获得新的生命租约。
我们的 Windows Azure ASP.NET 应用程序由两个生产实例支持,并配置为通过 Windows Azure 缓存的会话状态提供程序在分布式共存缓存中维护会话状态。这是配置自定义会话状态提供程序的 web.config 文件 sn-p:
<!-- Windows Azure Caching session state provider -->
<sessionState mode="Custom" customProvider="AFCacheSessionStateProvider">
<providers>
<add name="AFCacheSessionStateProvider" type="Microsoft.Web.DistributedCache.DistributedCacheSessionStateStoreProvider, Microsoft.Web.DistributedCache" cacheName="default" dataCacheClientName="default" applicationName="AFCacheSessionState"/>
</providers>
</sessionState>
<!-- Windows Azure Caching output caching provider -->
<caching>
<outputCache defaultProvider="AFCacheOutputCacheProvider">
<providers>
<add name="AFCacheOutputCacheProvider" type="Microsoft.Web.DistributedCache.DistributedCacheOutputCacheProvider, Microsoft.Web.DistributedCache" cacheName="default" dataCacheClientName="default" applicationName="AFCacheOutputCache" />
</providers>
</outputCache>
</caching>
以上设置定义在ASP.NET Session State Provider Configuration Settings (Windows Azure Caching)。我们使用默认的 dataCacheClientName。默认缓存和任何其他命名缓存在 Web 角色属性的缓存选项卡上进行配置。 GUI 提供了一种维护命名缓存设置的友好方式,这些设置以高度不可读的方式存储在所选服务配置的 .cscfg 文件中。注意默认缓存的驱逐策略、过期类型和生存时间属性。这些属性在How to Use Windows Azure Caching 中定义。它们暗示每个缓存的对象都有自己的生命周期,而 Session 对象应该一直持续到 ASP.NET Session 过期。我是否需要更改命名缓存设置以将我的 sessionState 超时时间延长到 60 分钟,或者会话提供程序是否会做正确的事情,而不管默认的命名缓存设置如何?如果我还需要调整命名缓存设置,它们应该是什么?
【问题讨论】:
-
一位值得信赖的 Azure 技术支持人员写信给我:“您可能知道会话对象就像存储在缓存中的任何其他对象一样,因此如果您正在为 ASP.NET 应用程序配置会话超时您还应该确保缓存中的会话对象在需要时不会被驱逐或过期。您还需要为任何灾难恢复启用高可用性 (HA)。所以是的,您应该覆盖与缓存相关的设置,因为您已在您提供的示例中完成,以获得最佳体验。”
-
所以,我将默认命名缓存驱逐设置更改为“无”,将过期类型更改为“滑动窗口”,将生存时间更改为“60”分钟。希望这将使我的 Session 对象按预期保持活动状态。
-
似乎工作正常。几个月来,生产中没有出现意外的会话超时问题。
标签: caching azure session-timeout session-state