有时只在asp.net中缺少会话数据

时间:2018-05-30 13:26:19

标签: c# asp.net azure session

我的asp.net应用程序最近托管到azure,之后我们面临一个在会话中丢失数据的问题,这种情况并非一直发生,而是随机发生但是当它在IIS中托管时,这个问题没有发生。

我们有一个自定义实体列表,当用户上传我们保存到数据库中的文件同时将其保存在会话中时,有一个文件上传工具,同时他们上传“N' N'成功处理并保存到DB和会话中的文件数。但是在页面加载后的同一生命周期中保存(此处为按钮单击事件)后,数据丢失。我检查/调试了没有代码在这些事件之间更改会话数据。

注意:此问题仅发生在不在localhost中的服务器中。

2 个答案:

答案 0 :(得分:0)

如果它在IIS上运行,但在Azure上运行。 这听起来像是会话超时问题(可能是全局服务器设置) 我建议在web.config文件中明确添加会话超时。

<system.web>
 <sessionState mode="InProc" cookieless="false" timeout="80" />
</system.web>
  

InProc模式,它将会话状态存储在Web服务器的内存中。这是默认值。

     

cookieless = false ,如果没有请求被视为无Cookie请求。

     

超时,指定会话在被放弃之前可以空闲的分钟数。

MSDN Library

了解详情

答案 1 :(得分:0)

我注意到Azure在问题中被标记了。

在Azure中,我们应该运行至少两个实例,这基本上是web-farm环境。因此,我们需要使用 Redis缓存

您只需在Azure中创建Redis缓存,并将以下内容添加到 web.config

<configuration>
  <connectionStrings>
    <add name="RedisConnection" connectionString="REDIS_CONNECTION_STRING" 
          providerName="System.Data.SqlClient"/>
  </connectionStrings>
  <system.web>    
    <sessionState mode="Custom" customProvider="SessionStateStore">
      <providers>
        <add name="SessionStateStore" 
          type="Microsoft.Web.Redis.RedisSessionStateProvider" 
          connectionString="RedisConnection" />
      </providers>
    </sessionState>
  </system.web>
<configuration>

使其无法使用Redis缓存的快速而肮脏的方法是打开Azure门户中的 Affinity Cookie 。但是,不建议这样做,因为您无法扩展应用程序。

enter image description here