gpt4 book ai didi

asp.net-mvc - 在 ASP.NET session 中存储任何内容会导致 500 毫秒的延迟

转载 作者:行者123 更新时间:2023-12-03 01:07:13 24 4
gpt4 key购买 nike

问题:

当您在 ASP.NET 站点中使用 session 时,几乎同时加载多个请求时,它会导致严重的延迟(500 毫秒的倍数)。

更具体地说,我的问题

我们的网站仅使用 session 作为其 SessionId。我们使用这个键来查找包含用户信息等的数据库表。这似乎是一个很好的设计,因为它存储了最少的 session 数据。不幸的是,如果您在 session 中不存储任何内容,SessionId 将会更改,因此我们存储 Session["KeepId"] = 1;。这足以 convince SessionId to not change .

在一个看似无关的注释中,该网站通过 Controller 操作提供定制的产品图像。如果需要,此操作会生成图像,然后重定向到缓存的图像。这意味着一个网页可能包含图像或其他资源,通过 ASP.NET 管道发送数十个请求。

无论出于何种原因,当您 (a) 同时发送多个请求并且 (b) 以任何方式涉及 session 时,您最终都会遇到大约 1/2 时间的随机 500 毫秒延迟。在某些情况下,这些延迟将达到 1000 毫秒或更长,并且始终以约 500 毫秒的间隔增加。更多请求意味着更长的等待时间。我们的页面包含数十张图像,某些图像可能需要等待 10 秒以上。

如何重现问题:

  1. 创建一个空的 ASP.NET MVC Web 应用程序
  2. 创建一个空 Controller 操作:

    public class HomeController : Controller
    {
    public ActionResult Test()
    {
    return new EmptyResult();
    }
    }
  3. 创建一个 test.html 页面,其中包含一些命中该操作的 img 标签:

    <img src="Home/Test?1" />
    <img src="Home/Test?2" />
    <img src="Home/Test?3" />
    <img src="Home/Test?4" />
  4. 运行页面并观察 Firebug 中的快速加载时间:

    Each image loads reasonably fast

  5. 执行以下操作之一(两者具有相同的结果):

    • 向 Global.asax.cs 添加一个空的 Session_Start 处理程序

      public void Session_Start() { }
    • 在 session 中添加一些内容

      public class HomeController : Controller
      {
      public ActionResult Test()
      {
      HttpContext.Current.Session["Test"] = 1;
      return new EmptyResult();
      }
      }
  6. 再次运行页面并注意响应中偶尔/随机的延迟。

    Some requests experience long delays

到目前为止我所知道的

我的问题

如何使用 session 但避免这些延迟?有谁知道修复方法吗?

如果没有修复,我想我们将不得不绕过 session 并直接使用 cookie ( session uses cookies )。

最佳答案

正如 Gats 提到的,问题在于 ASP.NET 锁定 session ,因此同一 session 的每个请求都必须串行运行。

烦人的部分是,如果我串行运行所有 5 个请求(来自示例),则需要大约 40 毫秒。使用 ASP.NET 的锁定,它会超过 1000 毫秒。 ASP.NET 似乎说:“如果 session 正在使用,则休眠 500 毫秒并重试。”

如果您使用 StateServer 或 SqlServer 而不是 InProc,它不会有帮助 - ASP.NET 仍然锁定 session 。

有一些不同的修复。我们最终使用了第一个。

改用 Cookie

Cookie 会在每个请求的 header 中发送,因此您应该保持简洁并避免敏感信息。也就是说, session 默认使用 cookie 通过存储 ASPNET_SessionId 字符串来记住谁是谁。我所需要的只是 id,因此当 ASP.NET 只是 cookie 中 id 的包装器时,没有理由忍受 ASP.NET 的 session 锁定。

因此我们完全避免 session 并在 cookie 中存储 guid。 Cookie 不会锁定,因此延迟是固定的。

使用 MVC 属性

您可以使用 session ,但可以通过将 session 设置为只读来避免锁定某些请求。

对于 MVC 3 应用程序,请在 Controller 上使用此属性使 session 变为只读(它不适用于特定操作):

[SessionState(SessionStateBehavior.ReadOnly)]

禁用某些路由的 session

您还可以disable session through MVC routing ,但是有点复杂。

禁用特定页面上的 session

对于 WebForms,您可以 disable session for certain aspx pages .

关于asp.net-mvc - 在 ASP.NET session 中存储任何内容会导致 500 毫秒的延迟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8349033/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com