问题:
当您在 ASP.NET 站点中使用会话时,几乎同时加载多个请求时会导致显着延迟(500 毫秒的倍数)。
更具体地说,我的问题
我们的网站将 session 专门用于其 SessionId。我们使用这个键来查找包含用户信息等的数据库表。这似乎是一个很好的设计,因为它存储了最少的会话数据。不幸的是,如果您在会话中不存储任何内容,则 SessionId 会发生变化,因此我们存储Session["KeepId"] = 1;
. 这足以说服 SessionId 不改变。
在看似无关的注释中,该站点通过控制器操作提供定制的产品图像。如果需要,此操作会生成图像,然后重定向到缓存的图像。这意味着一个网页可能包含图像或其他资源,通过 ASP.NET 管道发送数十个请求。
无论出于何种原因,当您 (a) 同时发送多个请求并且 (b) 以任何方式涉及会话时,您最终将随机延迟 500 毫秒,大约是 1/2 的时间。在某些情况下,这些延迟将达到 1000 毫秒或更长,并且总是以约 500 毫秒的间隔增加。更多请求意味着更长的等待时间。我们有几十张图片的页面可能会等待 10 多秒才能看到一些图片。
如何重现问题:
- 创建一个空的 ASP.NET MVC Web 应用程序
创建一个空的控制器动作:
public class HomeController : Controller { public ActionResult Test() { return new EmptyResult(); } }
制作一个 test.html 页面,其中包含一些执行该操作的 img 标签:
<img src="Home/Test?1" /> <img src="Home/Test?2" /> <img src="Home/Test?3" /> <img src="Home/Test?4" />
运行页面并在 firebug 中观察快速加载时间:
执行以下操作之一(两者的结果相同):
将一个空的 Session_Start 处理程序添加到您的 Global.asax.cs
public void Session_Start() { }
在会话中放置一些东西
public class HomeController : Controller { public ActionResult Test() { HttpContext.Current.Session["Test"] = 1; return new EmptyResult(); } }
再次运行该页面并注意响应中偶尔/随机的延迟。
到目前为止我所知道的
- 它发生在 MVC 2 & 3 和 WebForms 上
- 任何浏览器都会发生这种情况(我们尝试过 FF、Chrome、IE、Safari)
- 无论是否附加了调试器,它都会发生。此外,会话中不必实际存储任何内容(参见上面的 Session_Start 示例)。
- 它发生在 WebDev.exe、IIS Express 和 IIS 上
我的问题
如何使用会话但避免这些延迟?有谁知道修复?
如果没有修复,我想我们将不得不绕过会话并直接使用 cookie(会话使用 cookie)。