IIS / . net只允许单个并发响应给定的用户会话

本文关键字:用户 会话 响应 并发 net 许单个 IIS | 更新日期: 2023-09-27 18:10:55

我的问题是:

我们有一个。net 4.5 web表单应用程序。由于服务器端的大量数据访问和操作,应用程序中的一些页面需要很长时间才能加载。如果用户在页面完成加载之前关闭浏览器选项卡,并打开一个新选项卡,则对新选项卡中的应用程序的任何请求将挂起20分钟或更长时间,或者只是超时。但是,如果他们打开一个新的隐身窗口(Chrome)或其他浏览器,他们可以立即连接。

我相信这是因为。net顺序地处理来自同一会话的并发请求,如下所述:. NET会话状态概述

并发请求和会话状态访问ASP。NET会话状态每个会话是独占的,这意味着如果两个不同的用户进行并发请求,授予对每个单独会话的访问权限同时。但是,如果为对象发出两个并发请求相同的会话(通过使用相同的SessionID值),第一个请求获取对会话信息的独占访问权。第二个请求仅在第一个请求完成后执行。(第二次会议如果信息上的排他锁被释放,还能获得访问吗因为第一个请求超过了锁定超时时间。)如果@ Page指令中的EnableSessionState值被设置为只读对只读会话信息的请求不会导致会话失败会话数据的独占锁。但是,只读请求会话数据可能仍然需要等待由读写操作设置的锁请求清除会话数据。

我在研究这个问题时发现的一些帖子已经暗示(但没有证实),当浏览器选项卡在响应完成之前关闭时,会话会"卡住",并且不会响应来自同一会话的新请求,直到设置的SessionTimeout时间已经过去。我的假设是,来自隐身窗口的请求被接受,因为它有一个新的会话。

除了等待超时外,有没有人知道有什么方法可以释放会话以接收新请求?是否有某种方法可以检测到客户端不再监听?我发现了Response.IsClientConnected,它看起来很有前途,但我不确定它将如何使用。

注意:这是一个包含大量业务逻辑的遗留应用程序,当前的条件不允许此时进行重写的时间或预算。因此,"重新编写页面以使其加载更快"的建议并不立即可行,尽管我承认这确实是最好的解决方案。

IIS / . net只允许单个并发响应给定的用户会话

在并发性和会话状态方面我也遇到过类似的问题。

尝试在web.config中设置enableSessionState="ReadOnly"。

看到我的想法在这里:EnableSessionState =只读-可能的副作用?

编辑:对不起,看到你可能已经试过了

在web中执行enableSessionState="Readonly"。

允许会话写入,你可以覆盖这个设置为一个页面,<%@ page Language=" c# " AutoEventWireup="true" CodeBehind="demo.aspx.cs" Inherits="com。演示" EnableSessionState = " true " %>

对这些页面的请求将按顺序服务,这是有意义的,因为您正在对会话进行更改,而您不想并发以避免脏读。

您是否尝试过此会话较少的mvc控制器为mvc 2 rc?

"您有一个客户端向服务器发出多个并发请求。默认行为是将这些请求序列化;对于无会话控制器,它们并行执行。"

这个链接是旧的,但也许你可以找到你的解决方案在MVC3少会话控制器