【问题标题】:ASP.net site: Long-loading page for user puts all other page loads for user on HoldASP.net 站点:用户的长时间加载页面将用户的所有其他页面加载搁置
【发布时间】:2010-10-31 12:05:27
【问题描述】:

我有以下场景(Asp.net 3.5、Windows Server 2008 R2、IIS7):

  • User1 使用 Firefox 登录 abc.com,然后转到需要几分钟才能加载的页面。
  • 在加载该页面时,User1 无法加载站点上的任何其他页面。
  • 使用此浏览器的用户 1 在站点上的所有其他页面请求都不会收到响应,直到第一个页面完成加载或超时(然后其他请求快速连续完成)。
  • 如果我打开不同的浏览器(Chrome,虽然也可以很容易地使用 IE)并使用同一用户登录该站点,但第一页仍在加载(并且其他请求处于暂停状态),但我没有加载页面时出现问题。

因此,似乎一个单独的用户会话一次只能处理一个请求(因为使用不同浏览器登录的同一用户实际上是与 ASP.net 不同的会话)。

我想要发生的是,在加载 User1 的长时间加载请求时,User1 能够加载站点上的其他页面(在同一浏览器中)。

监控服务器,没有内存问题(Sql Server 也没有)。我正在这样做,而我是唯一使用该网站的人。站点是 ASP.net 3.5,使用 Forms 身份验证。只有非标准的设置细节是 ViewState 被存储在 Session 中。

到目前为止,在我的搜索中,我还没有找到与此相关的任何内容。如果这是预期的行为,我该如何覆盖它?如果这不是预期的行为,可能是什么原因造成的,我该如何解决?

【问题讨论】:

  • 第一个问题——需要几分钟才能完成的服务器上发生了什么?这是预期的行为吗?每个用户是否都会遇到这种情况,或者这种情况是作为 App_Start() 的一部分发生的还是它被称为什么?
  • 这是用户将要访问的特定页面。通常是预期的行为,可能会非常长时间运行查询(用户可以查询包含数百万条记录的表)。这也是由于意外行为(代码中的错误导致响应需要很长时间)而发生的。但是,即使在这种情况下,它也只会影响此用户/浏览器。
  • 因此,从用户的角度来看,这是一份冗长的报告,预计会花费很长时间。您是否可以考虑异步运行报告——即“单击此链接,我们将很快通过电子邮件发送此报告”?然后,您在自己的线程中启动报告,没有人会感到不便。
  • Bob - 我已经为许多长期运行的进程执行此操作,并计划在找到需要它的进程时执行更多操作。问题是有时它是一个不适合异步的过程,有时它是一个错误,直到修复,最终可能会占用用户一段时间(而如果用户的其他页面请求得到了答复,它不会那么痛苦)。您对如何回答上述问题有任何想法吗?

标签: asp.net performance


【解决方案1】:

这种行为是设计使然;不允许同时访问会话状态。具有相同 SessionID 的请求将被独占锁定,以防止其状态可能遭到破坏。

要解决这个问题,您可以在页面指令中禁用会话状态。

<%@Page EnableSessionState="false"/>

阅读“并发请求和会话状态”http://msdn.microsoft.com/en-us/library/ms178581.aspx 了解更多信息。

设置EnableSessionState="ReadOnly" 将防止该页面获得对 SessionState 的独占锁定(但页面本身必须等待用户的其他非只读请求完成后才能加载)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-11-21
    • 1970-01-01
    • 1970-01-01
    • 2021-12-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-09
    相关资源
    最近更新 更多