【问题标题】:Session timeout in production but not locally生产中的会话超时但不是本地的
【发布时间】:2020-11-05 13:23:11
【问题描述】:

我有一个用 C# 编写的 ASP.NET WebForms 应用程序,它在本地运行程序时按预期运行。会话在 60 分钟后超时,这是在 web.config 中配置的。

<sessionState mode="InProc" timeout ="60"></sessionState>

但是,托管在 Azure 服务器上的发布版本会在大约 5 分钟后超时。

这里有什么问题?

【问题讨论】:

  • InProc 会话存在问题——尤其是在处理云/网络农场/网络花园时。你为什么用InProc
  • 我对开发还很陌生,所以我真的不知道各种会话状态之间的区别,但 InProc 是默认设置。此外,当我尝试将其更改为 StateServer 模式时,出现异常“无法向会话状态服务器发出会话状态请求。”

标签: c# asp.net azure session timeout


【解决方案1】:

据我所知,In-Proc 会话模式将会话状态存储在单个 Web 服务器的内存中。此外,如果 Web 服务器实例因故障而宕机,会导致会话数据丢失。

由于您可以将 Web 应用扩展到多个实例,因此使用 In-Proc 会话模式不是在 Azure 上托管 Web 应用的好习惯,因为它无法在 Web 应用的多个实例之间共享会话状态。

简单来说,您可以Configure SQL Server to Store ASP.NET Session StateSession state with Azure Redis cache。此外,正如article 中所述,如果必须使用会话状态,最好的解决方案是使用缓存提供程序,例如Session State Provider for Azure Cache

旧版应用的另一个选项是在应用服务中保持ARR Affinity 开启(如果您正在使用它们)。这在客户端首次连接时有效地设置了一个 cookie,因此负载均衡器将始终将它们连接到同一个实例,因此内存中的会话状态有效。

【讨论】:

  • 感谢您的详细回复!我正在调查您为其他会话状态模式发送的信息。但是,如果我想继续使用 InProc,我可以利用 ARR Afifinity,对吗?这不是默认启用的吗?所以它应该已经正常工作了
  • 我检查了 cookie,ARRAfinity 和 ASP.NET_SessionId 实际上保持不变。但我注意到 Global.asax 中的 Session_Start 事件在生产中多次触发,所以我认为这就是会话变量为空的原因。是什么原因造成的?
  • so in-memory session state works. 假设 Web 服务器永远不会重新启动。 :)
  • 哪些情况会导致网络服务器重启?因为我在 Azure 上托管了一个单独的 ASP.NET 应用程序,所以使用 InProc 会话状态以相同的方式进行设置,并且我没有遇到它在 5 分钟左右后超时的问题
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-11-17
  • 1970-01-01
相关资源
最近更新 更多