我的asp.net应用程序最近托管到azure,之后我们面临一个在会话中丢失数据的问题,这种情况并非一直发生,而是随机发生但是当它在IIS中托管时,这个问题没有发生。
我们有一个自定义实体列表,当用户上传我们保存到数据库中的文件同时将其保存在会话中时,有一个文件上传工具,同时他们上传“N' N'成功处理并保存到DB和会话中的文件数。但是在页面加载后的同一生命周期中保存(此处为按钮单击事件)后,数据丢失。我检查/调试了没有代码在这些事件之间更改会话数据。
注意:此问题仅发生在不在localhost中的服务器中。
答案 0 :(得分:0)
如果它在IIS上运行,但在Azure上运行。
这听起来像是会话超时问题(可能是全局服务器设置)
我建议在web.config
文件中明确添加会话超时。
<system.web>
<sessionState mode="InProc" cookieless="false" timeout="80" />
</system.web>
了解详情InProc模式,它将会话状态存储在Web服务器的内存中。这是默认值。
cookieless = false ,如果没有请求被视为无Cookie请求。
超时,指定会话在被放弃之前可以空闲的分钟数。
答案 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 。但是,不建议这样做,因为您无法扩展应用程序。