我在ASP.NET MVC中开发了一个适用于Windows身份验证的应用程序。我正在使用会话,临时数据类技术来保存不同请求中的数据。 但问题在于,当用户在会话中保持系统空闲超过20分钟时,临时数据不再可用,因为会话超时。
要解决这个问题,我打算使用下面的代码。 我会每20分钟发一次ajax请求以保持会话。 因此,即使用户处于空闲状态,系统也不会超时,用户可以从他之前离开的地方开始。
setInterval(function () {
$.ajax({
url: url,
datatype: 'json',
async: true,
cache: false,
success: function () {
// alert("2 min");
}
});
}, 1200000);
我想知道他们使用这种方法是否有任何缺点。 或者在这种情况下使用任何替代方法?
答案 0 :(得分:0)
根据msdn
Timeout属性不能设置为大于525,600的值 分钟(1年)。默认值为20分钟。
会话超时的增加将阻止服务器释放分配给非活动会话的内存。
缺点:如果您有大量用户并且会话超时增加,您将遇到性能问题,您的非活动会话将保留在Web服务器内存中,这可能会导致应用程序池回收,这会导致所有用户失去所有会话。
答案 1 :(得分:0)
该值取决于您的应用程序批评,但您的webapp应始终具有断开连接,因为...大多数用户不会正常断开连接...
如果您呼叫的页面什么都不做,那么您的服务器对于适量的用户来说不会遇到任何问题(低于1000个同时连接)。
您的ajax调用可以是一个选项,但更简洁的方案是增加会话超时值。即使在非关键应用程序上,我也不会建议它超过2小时。在你的web.config中:
<sessionState mode="StateServer" cookieless="false" timeout="120"/>
答案 2 :(得分:0)
我会以不同的方式前进。我将会话临时数据存储在SQL \ other存储中,并将其映射到ASP.Net SessionID。当用户登录网站时,我会根据SessionID将他的临时数据存储在SQL上。此外,我会订阅Session_End事件(仅在InProc模式下工作),当会话超时(20分钟)时,我将根据会话更新数据库中的数据。
然后经过几个小时的超时,当用户回到相同的浏览器会话时 - 他的SessionID将是相同的,然后如果会话为空,我会将数据从数据库恢复到新的会话,因此用户赢了'看到有什么不同。如果他关闭浏览器并再次启动它,那么会话ID将是新的,它将与您当前的方法相同。
此外,我还有一些任务可以清理DB中的旧会话数据而不是垃圾数据库。
因此,在这种方法中,您的Web服务器不会在AppPool进程内存中存储数小时无用的会话数据,而且它也不会像原始问题那样获得大量的保持活动请求。
更新:其他一点是默认情况下,IIS每24小时或20分钟不活动后回收AppPool,所以在你的方法中保持活着 - 会话将在24小时后网络应用程序启动时死亡并保持活动请求不会保存。在我的方法中,无关紧要,因为我们将临时会话数据存储在数据库存储中,并且它将被重新加载。