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

时间:2014-06-30 16:32:15

标签: c# asp.net .net session iis

这是我的问题:

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

我认为这是因为.Net按顺序处理来自同一会话的并发请求,如下所述:ASP.NET Session State Overview

  

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

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

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

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

3 个答案:

答案 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之后找到解决方案。