【发布时间】:2014-08-21 02:27:36
【问题描述】:
这是我的问题:
我们有一个 .Net 4.5 网络表单应用程序。由于服务器端的大量数据访问和操作,应用程序中的某些页面需要很长时间才能加载。如果用户在页面完成加载之前关闭其浏览器选项卡并打开一个新选项卡,则对新选项卡中应用程序的任何请求都将挂起 20 分钟或更长时间,或者只是超时。但是,如果他们打开新的隐身窗口 (Chrome) 或其他浏览器,他们可以立即连接。
我相信这是因为 .Net 按顺序处理来自同一会话的并发请求,如下所述:ASP.NET Session State Overview
并发请求和会话状态访问 ASP.NET 会话状态 每个会话都是独占的,这意味着如果两个不同的用户 并发请求,授予对每个单独会话的访问权限 同时。但是,如果对 相同的会话(通过使用相同的 SessionID 值),第一个请求 获得对会话信息的独占访问权。第二个请求 仅在第一个请求完成后执行。 (第二届 如果信息的排他锁被释放,也可以获得访问权限 因为第一个请求超过了锁定超时。)如果 @Page 指令中的 EnableSessionState 值设置为 ReadOnly,一个 对只读会话信息的请求不会导致 会话数据的排他锁。但是,只读请求 会话数据可能仍然需要等待读写设置的锁 请求清除会话数据。
我在研究此问题时发现的一些帖子暗示(但未证实)当浏览器选项卡在响应完成之前关闭时,会话会“卡住”并且不会响应来自同一会话的新请求直到设置的 SessionTimeout 期限过去。我的假设是接受来自隐身窗口的请求,因为它有一个新会话。
除了等待超时之外,有没有人知道任何方法可以将会话释放到新请求?有什么方法可以检测到客户端不再监听?我找到了Response.IsClientConnected,看起来很有希望,但我不确定它会如何使用。
注意:这是一个包含大量业务逻辑的遗留应用程序,目前的情况不允许重新编写的时间或预算。因此,“只是重写页面以便加载更快”的建议并不是立即可行的,尽管我承认这确实是最好的解决方案。
【问题讨论】:
-
你有什么解决办法吗?我也面临同样的问题。
标签: c# asp.net .net session iis