Javascript ASP.NETMVC:使用windows身份验证处理应用程序的会话

Javascript ASP.NETMVC:使用windows身份验证处理应用程序的会话,javascript,jquery,asp.net-mvc-4,Javascript,Jquery,Asp.net Mvc 4,我已经在ASP.NET MVC中开发了一个应用程序,它可以在windows身份验证上运行。我正在使用会话、临时数据之类的技术在不同的请求中持久化数据。 但这里的问题是,当用户在会话中使系统空闲超过20分钟时,由于会话超时,临时数据不再可用 为了解决这个问题,我计划使用下面的代码。 我将每20分钟发出一个ajax请求以保持会话。 因此,即使用户处于空闲状态,系统也不会超时,用户可以从之前离开的地方开始 setInterval(function () { $.ajax({

我已经在ASP.NET MVC中开发了一个应用程序,它可以在windows身份验证上运行。我正在使用会话、临时数据之类的技术在不同的请求中持久化数据。 但这里的问题是,当用户在会话中使系统空闲超过20分钟时,由于会话超时,临时数据不再可用

为了解决这个问题,我计划使用下面的代码。 我将每20分钟发出一个ajax请求以保持会话。 因此,即使用户处于空闲状态,系统也不会超时,用户可以从之前离开的地方开始

 setInterval(function () {
            $.ajax({
                url: url,
                datatype: 'json',
                async: true,
                cache: false,
                success: function () {
                       // alert("2 min");
                }
            });

        }, 1200000);
我想知道他们使用这种方法是否有任何缺点。 或者在这种情况下使用任何替代方法?

根据msdn

超时属性不能设置为大于525600的值 会议记录(1年)。默认值为20分钟

会话超时的增加将阻止服务器释放分配给非活动会话的内存


缺点:如果您有大量用户,并且随着会话超时时间的增加,您的非活动会话将保留在Web服务器内存中,这可能会导致应用程序池回收,这将导致所有用户失去所有会话。

该值将取决于您的应用程序关键性,但您的Web应用程序应始终具有断开超时,因为。。。大多数用户无法正确断开连接

如果您调用的页面不执行任何操作,那么对于中等数量的用户(低于1000个同步连接),您的服务器不会出现任何问题

ajax调用可以是一种选择,但更干净的方案是增加会话超时值。我不建议它超过2小时,即使是在非关键应用程序上。在web.config中:

<sessionState mode="StateServer" cookieless="false" timeout="120"/>

我会用不同的方式。我会将您的会话临时数据存储在SQL\other存储中,并将其映射到ASP.Net SessionID。当用户登录该站点时,我会基于SessionID将他的临时数据存储在SQL上。我还将订阅会话结束事件(仅在InProc模式下工作),当会话超时(20分钟)时,我将根据会话更新数据库中的数据

然后在几个小时的超时后,当用户返回到同一个浏览器会话时,他的SessionID将是相同的,如果会话为空,我将把数据从数据库恢复到新会话,所以用户不会看到任何差异。如果他关闭浏览器并再次启动它,那么会话id无论如何都是新的,它的工作原理与您当前的方法相同

此外,我还有一些任务将清理数据库中的旧会话数据,以避免对数据库造成垃圾

因此,在这种方法中,您的web服务器不会在AppPool进程内存中存储数小时无用的会话数据,也不会像最初的问题中那样获取大量的保持活动请求


更新:另一点是,默认情况下,IIS每24小时或不活动20分钟后回收一次应用程序池,因此在您使用keep alive的方法中,会话将在web应用程序启动24小时后停止,keep alive请求不会保存它。在我的方法中,这并不重要,因为我们将临时会话数据存储在DB存储器中,并且可以很好地重新加载。

如果用户将系统锁定更长的时间(例如6-7小时或一整天),您还可以增加会话超时,然后再次访问它,对于应用程序来说,会话超时时间更长(比如7小时或更长)是一个好选择吗?