繁体   English   中英

ASP.Net MVC:使用Windows身份验证处理应用程序的会话

[英]ASP.Net MVC : Handle session for application using windows authetication

我已经在Windows身份验证的ASP.NET MVC中开发了一个应用程序。 我正在使用会话,临时数据这种技术来将数据持久保存在不同的请求中。 但是这里的问题是,当用户在会话中使系统空闲超过20分钟时,由于会话超时,临时数据不再可用。

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

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

        }, 1200000);

我想知道他们是否有使用这种方法的利弊。 还是在这种情况下可以使用其他替代方法?

根据msdn

超时属性不能设置为大于525,600分钟(1年)的值。 默认值为20分钟。

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

缺点:如果您有大量用户,并且会话超时增加,则您将遇到性能问题,您的非活动会话将保留在Web服务器内存中,这可能导致应用程序池回收,从而导致所有用户的所有会话丢失。

该值取决于您对应用程序的批评程度,但您的Web应用程序应始终具有断开连接超时,因为...大多数用户无法正确断开连接...

如果您调用的页面不执行任何操作,则对于中等数量的用户(贝洛1000同时连接),您的服务器不会有任何问题。

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

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

我会以不同的方式去。 我会将您的会话临时数据存储在SQL \\ other存储中,并将其映射到ASP.Net SessionID。 当用户在站点上登录时,我将基于SessionID将其临时数据存储在SQL上。 我也将订阅Session_End事件(仅在InProc模式下有效),并且当会话超时(20分钟)时,我将基于会话更新DB中的数据。

然后在几个小时的超时后,当用户返回相同的浏览器会话时-他的SessionID将相同,然后如果会话为空,我会将数据从DB还原到该新会话,因此用户将看不到任何内容。区别。 如果他关闭浏览器并再次启动,则会话ID无论如何都是新的,并且将与您当前的方法相同。

我也有一些任务,将清理数据库中的旧会话数据以免浪费数据库。

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

更新:另一点是,默认情况下,IIS每隔24小时或20分钟不活动后都会回收AppPool,因此在保持活动状态下-会话将在Web应用程序启动24小时后终止,并且保持活动请求将无法保存它。 在我的方法中,这无关紧要,因为我们将临时会话数据存储在数据库存储中,并且可以很好地重新加载。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM