IIS / .Net 仅允许对给定用户会话的单个并发响应
Posted
技术标签:
【中文标题】IIS / .Net 仅允许对给定用户会话的单个并发响应【英文标题】:IIS / .Net only allows single concurrent response to given user session 【发布时间】: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
,看起来很有希望,但我不确定它会如何使用。
注意:这是一个包含大量业务逻辑的遗留应用程序,目前的情况不允许重新编写的时间或预算。因此,“只是重写页面以便加载更快”的建议并不是立即可行的,尽管我承认这确实是最好的解决方案。
【问题讨论】:
你有什么解决办法吗?我也面临同样的问题。 【参考方案1】:你试过这个session less mvc controller for mvc 2 rc吗?
“您有一个客户端向服务器发出多个并发请求。默认行为是这些请求将被序列化;使用无会话控制器,它们并行执行。”
那个链接是旧的,但也许你可以在Session less controller in MVC3之后找到你的解决方案。
【讨论】:
【参考方案2】:在 web.config 中执行 enableSessionState="Readonly" 会提高您的性能。
要允许会话写入,您可以将页面的此设置覆盖为 EnableSessionState="true" %>
对此类页面的请求将按顺序提供,这很有意义,因为您正在对不希望并发的会话进行更改以避免脏读。
【讨论】:
【参考方案3】:我自己也有关于并发和会话状态的类似问题。
尝试在您的 web.config 中设置 enableSessionState="ReadOnly"。
在这里查看我的想法:EnableSessionState = ReadOnly - possible side effects?
编辑:抱歉,您可能已经尝试过这样做。
【讨论】:
您对 ReadOnly 对实际写入会话的页面所做的操作有任何经验吗?我们的一些页面设置了会话变量。 是的,我们正在非常广泛地从会话中写入和读取,并且自从我们更改设置以来,我们没有遇到任何负面影响,只是提高了性能。 这绝对不适合我们。当我将会话设置为只读时,我什至无法登录。似乎值没有保存在会话中,这对只读有意义。 我认为最大的风险是单个会话能够通过许多同时请求轻松耗尽服务器资源。这是一个真正的问题吗?如果是,是否有设置按会话限制活动请求?以上是关于IIS / .Net 仅允许对给定用户会话的单个并发响应的主要内容,如果未能解决你的问题,请参考以下文章
如何确定 ASP.NET 站点 (IIS) 上的用户数?他们的信息呢?