这是我的问题:
我们有.Net 4.5网络表单应用程序。由于服务器端的大量数据访问和操作,应用程序中的某些页面需要很长时间才能加载。如果用户在页面完成加载之前关闭其浏览器选项卡,并打开新选项卡,则新选项卡中对应用程序的任何请求都将挂起20分钟或更长时间,或者只是超时。但是,如果他们打开新的隐身窗口(Chrome)或其他浏览器,则可以立即连接。
我认为这是因为.Net按顺序处理来自同一会话的并发请求,如下所述:ASP.NET Session State Overview
并发请求和会话状态访问ASP.NET会话状态 是每个会话独占,这意味着如果两个不同的用户 并发请求,授予对每个单独会话的访问权限 同时。但是,如果有两个并发请求 同一会话(通过使用相同的SessionID值),第一个请求 获得会话信息的独占访问权限。第二个请求 仅在第一个请求完成后执行。 (第二届会议 如果释放信息的独占锁,也可以访问 因为第一个请求超过了锁定超时。)如果 @ Page指令中的EnableSessionState值设置为ReadOnly,a 请求只读会话信息不会导致 对会话数据的独占锁定。但是,只读请求 会话数据可能仍然必须等待读写设置的锁定 请求清除会话数据。
我在研究此问题时发现的一些帖子曾暗示(但未确认)当浏览器标签在响应完成之前关闭时,会话“卡住”并且不会响应来自同一会话的新请求直到设置的SessionTimeout期限结束。我的假设是,接受来自隐身窗口的请求,因为它有一个新的会话。
除了等待超时之外,有没有人知道将会话释放到新请求的任何方法?有没有办法检测客户端不再监听?我找到Response.IsClientConnected
,看起来很有希望,但我不确定它会如何使用。
注意:这是一个包含大量业务逻辑的遗留应用程序,当前条件不允许此时重写的时间或预算。因此,“只是重新编写页面以便加载更快”的建议并不是立即可行的,尽管我承认这确实是最好的解决方案。
答案 0 :(得分:2)
我自己在并发和会话状态方面有类似的问题。
尝试在web.config中设置enableSessionState =“ReadOnly”。
请在此处查看我的想法:EnableSessionState = ReadOnly - possible side effects?
编辑:抱歉,看到您可能已经尝试过这样做了。
答案 1 :(得分:0)
在web.config中执行enableSessionState =“Readonly”可以提高性能。
要允许会话写入,您可以覆盖页面的此设置,<%@ Page Language =“C#”AutoEventWireup =“true”CodeBehind =“demo.aspx.cs”Inherits =“com.Demo” EnableSessionState =“true”%>
这些页面的请求将按顺序提供,这是有意义的,因为您正在对会话进行更改,您不希望并发以避免脏读。
答案 2 :(得分:0)
你试过这个session less mvc controller for mvc 2 rc吗?
“您有一个客户端向服务器发出多个并发请求。默认行为是这些请求将被序列化;使用会话较少的控制器并行执行。”
该链接很旧,但也许您可以在Session less controller in MVC3之后找到解决方案。