IIS / .Net仅允许对给定用户会话进行单个并发响应

这是我的问题:

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

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

并发请求和会话状态对ASP.NET会话状态的访问是每个会话独占的,这意味着如果两个不同的用户发出并发请求,则同时授予对每个单独会话的访问权限。 但是,如果对同一会话发出两个并发请求(通过使用相同的SessionID值),则第一个请求将获得对会话信息的独占访问权。 第二个请求仅在第一个请求完成后执行。 (如果由于第一个请求超过锁定超时而释放信息的独占锁定,则第二个会话也可以访问。)如果@ Page指令中的EnableSessionState值设置为ReadOnly,则只读请求会话信息不会导致会话数据的独占锁定。 但是,会话数据的只读请求可能仍然必须等待由会话数据的读写请求设置的锁定才能清除。

我在研究这个问题时发现的一些post曾暗示(但未确认)当浏览器选项卡在响应完成之前关闭时,会话“卡住”并且不会响应来自同一会话的新请求直到该集合SessionTimeout期限已过。 我的假设是,接受来自隐身窗口的请求,因为它有一个新的会话。

除了等待超时之外,有没有人知道将会话释放到新请求的任何方法? 有没有办法检测客户端不再监听? 我发现Response.IsClientConnected ,看起来很有希望,但我不确定如何使用它。

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

关于并发性和会话状态,我自己也遇到过类似的问题。

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

在这里看到我的想法: EnableSessionState = ReadOnly – 可能的副作用?

编辑:抱歉,看到您可能已经尝试过这样做。

在web.config中执行enableSessionState =“Readonly”可以提高您的性能。

要允许会话写入,您可以覆盖页面的此设置,因为,<%@ Page Language =“C#”AutoEventWireup =“true”CodeBehind =“demo.aspx.cs”Inherits =“com.Demo” EnableSessionState =“true” %>

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

你有没有试过这个会话少mvc控制器为mvc 2 rc ?

“你有一个客户端向服务器发出多个并发请求。默认行为是这些请求将被序列化;使用会话较少的控制器,它们并行执行。”

这个链接很旧,但也许你可以在MVC3中使用Session less controller找到你的解决方案。