为什么Global.asax.cs中的Session_Start会导致性能问题?

2023-11-24

当我在 Global.asax.cs 中创建一个空的 Session_Start 处理程序时,在将页面渲染到浏览器时会导致严重的影响。

如何重现:

创建一个空的 ASP.NET MVC 3 Web 应用程序(我使用的是 MVC 3 RC2)。 然后使用以下代码添加一个 Home 控制器:

public class HomeController : Controller
{
  public ActionResult Index()
  {
    return View();
  }
  public ActionResult Number(int id)
  {
    return Content(id.ToString());
  }
}

接下来创建一个视图 Home/Index.cshtml 并将以下内容放入 BODY 部分:

@for (int n = 0; n < 20; n++)
{ 
  <iframe src="@Url.Content("~/Home/Number/" + n)" width=100 height=100 />
}

当您运行此页面时,您将看到页面上出现 20 个 IFRAME,每个 IFRAME 内都有一个数字。我在这里所做的只是创建一个页面,在幕后加载另外 20 个页面。在继续之前,请记下这 20 个页面的加载速度(刷新页面几次以重复加载)。

接下来转到 Global.asax.cs 并添加此方法(是的,方法主体为空):

protected void Session_Start()
{
}

现在再次运行该页面。这次您会注意到 20 个 IFRAME 的加载速度要慢得多,一个接一个的间隔大约为 1 秒。这很奇怪,因为我们实际上并没有在 Session_Start 中执行任何操作...它只是一个空方法。但这似乎足以导致所有后续页面的速度变慢。

有谁知道为什么会发生这种情况,更好的是有人有修复/解决方法吗?

Update

我发现这种行为仅在附加调试器(使用 F5 运行)时才会发生。如果您在没有附加调试器(Ctrl-F5)的情况下运行它,那么它似乎没问题。所以,也许这不是一个严重的问题,但仍然很奇怪。


tl;dr:如果您在使用 Webforms 时遇到此问题,并且不需要对该特定页面中的会话状态进行写访问,请添加EnableSessionState="ReadOnly"给你的@Page指令有帮助。


显然,存在Session_Start单独强制 ASP.NET 按顺序执行源自同一会话的所有请求。但是,如果您不需要会话的写访问权限,则可以逐页修复此问题(见下文)。

I've created my own test setting with Webforms, which uses an aspx page to deliver images.1

这是测试页面(纯 HTML,项目的起始页面):

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head><title></title></head>
<body>
    <div>
        <img src="GetImage.aspx?text=A" />
        <img src="GetImage.aspx?text=B" />
        <img src="GetImage.aspx?text=C" />
        <img src="GetImage.aspx?text=D" />
        <img src="GetImage.aspx?text=E" />
        <img src="GetImage.aspx?text=F" />
        <img src="GetImage.aspx?text=G" />
        <img src="GetImage.aspx?text=H" />
        <img src="GetImage.aspx?text=I" />
        <img src="GetImage.aspx?text=J" />
        <img src="GetImage.aspx?text=K" />
        <img src="GetImage.aspx?text=L" />
    </div>
</body>
</html>

这是 aspx 页面 (GetImage.aspx):

<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="GetImage.aspx.cs" Inherits="CsWebApplication1.GetImage" %>

以及代码隐藏的相关部分(GetImage.aspx.cs,using and namespace跳过):

public partial class GetImage : System.Web.UI.Page
{
    protected void Page_Load(object sender, EventArgs e)
    {
        Debug.WriteLine("Start: " + DateTime.Now.Millisecond);
        Response.Clear();
        Response.ContentType = "image/jpeg";

        var image = GetDummyImage(Request.QueryString["text"]);
        Response.OutputStream.Write(image, 0, image.Length);
        Debug.WriteLine("End: " + DateTime.Now.Millisecond);
    }

    // Empty 50x50 JPG with text written in the center
    private byte[] GetDummyImage(string text)
    {
        using (var bmp = new Bitmap(50, 50))
        using (var gr = Graphics.FromImage(bmp))
        {
            gr.Clear(Color.White);
            gr.DrawString(text,
                new Font(FontFamily.GenericSansSerif, 10, FontStyle.Regular, GraphicsUnit.Point),
                Brushes.Black, new RectangleF(0, 0, 50, 50),
                new StringFormat { Alignment = StringAlignment.Center, LineAlignment = StringAlignment.Center });
            using (var stream = new MemoryStream())
            {
                bmp.Save(stream, ImageFormat.Jpeg);
                return stream.ToArray();
            }
        }
    }
}

试运行

  • Run 1,未修改:页面加载速度快,输出窗口显示随机组合Start and Ends,这意味着请求得到并行处理。

  • Run 2,添加空Session_Start to global.asax(需要在浏览器中按一次F5,不知道这是为什么):Start and End交替,显示请求按顺序处理。多次刷新浏览器表明,即使未附加调试器,也会存在性能问题。

  • Run 3,与运行 2 类似,但添加EnableSessionState="ReadOnly" to the @Page的指令GetImage.aspx:调试输出显示多个Starts 在第一个之前End。我们又并行了,而且表现不错。


1 Yes, I know that this should be done with an ashx handler instead. It's just an example.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么Global.asax.cs中的Session_Start会导致性能问题? 的相关文章

随机推荐

  • 如何在 Pandas 中连接包含列表(系列)的两列

    我想连接 pandas 中的两列 每列由 1x4 元素的浮点列表组成 我想合并两列 使输出为 1x8 的向量 下面显示了数据框的片段 ue bs 1 27932459e 01 7 83234197e 02 3 24789420e 02 4
  • 使用 XSL 对 XML 文件进行哈希处理

    我正在尝试找到一种方法来 散列 XML 文件的内容 其根源是需要比较传入的一些文本节点与我希望确保校验和相同的文本节点 传入的文本节点已从表单提交返回 我需要确保它们没有更改 在合理范围内 排除冲突 建筑很糟糕 所以请不要问它 我被锁定在给
  • 如何将div垂直换行然后水平换行

    我需要水平显示我的网站中的搜索结果数据 我的网站遵循 Metro UI 方法 因此我希望数据水平流动而不是垂直流动 我的要求如下图所示 结果数据是动态的 我想首先根据父 div 高度垂直绘制 div 然后水平绘制 类似于WPF包裹面板的东西
  • 如何使用Spring表达式语言获取作业ID?

    我想使用 spring 表达语言获取工作 ID 我试过 jobExecutionContext jobId 但它不起作用 单独使用 SpEL 无法访问作业 ID 您可以使用 JobExecutionListener 将其添加到executi
  • System.currentTimeMillis() 如何获取时间

    是方法吗System currentTimeMillis 是否实现对底层操作系统进行系统调用以接收当前时间 我之所以这么问 是因为据我所知 该方法运行得相当快 只需要 6 个 CPU 时钟 但这没有意义 因为众所周知系统调用很慢 我在这里缺
  • 如何在 Android 上进行异步 URL 连接?

    我正在使用以下类连接到我的网络服务 我想让这个异步 我怎样才能做到这一点 package org stocktwits helper import java io BufferedReader import java io IOExcept
  • tmux 绑定分号

    有什么办法可以绑定吗 059 到 tmux 中的命令 默认绑定到last pane 但是 我想将其重新绑定到 select pane R 我尝试将以下内容放入我的 tmux conf 中 但似乎都不起作用 bind 059 select p
  • 在 Html.BeginForm() 中使用 DELETE 表单方法?

    我想尽可能使用适当的 HTTP 方法 在这种情况下 当单击按钮删除某些内容时 我想使用属性触发控制器操作 HttpDelete 但是 我似乎无法使用此方法创建表单 使用 Razor 语法 这FormMethod枚举没有选项Delete并且执
  • 如何在Makefile中添加#define?

    我有一个 C 项目 我需要在一些 CXX 文件中定义一个变量 我有近 800 个文件 我需要为其中 200 个文件定义一个变量 所以我想在 makefile 中定义它 那么我们怎样才能做到这一点呢 只需添加 Dxxx yy在命令行上 xxx
  • 在AppDelegate.m中获取屏幕当前显示的UIViewController

    目前的UIViewController屏幕上的应用程序需要通过设置一些徽章视图来响应来自 APN 的推送通知 但我怎样才能得到UIViewController在方法中application didReceiveRemoteNotificat
  • 每次点击取消按钮时,搜索栏都会向下跳一行

    我已经实现了一个 UISearchBar 来搜索来自外部 API 的项目目录 搜索功能按预期工作 但问题是 每次我按下搜索栏文本字段右侧的取消按钮时 整个搜索栏都会向下移动一行 看起来就像推动了整个搜索栏一样 表格视图也向下 因此 如果我在
  • Android studio:UnsatisfiedLinkError:findLibrary 返回 null - 加载本机库

    我正在 Android Studio 中制作一个使用两个库的应用程序 带有 Android 包装器和 jar 库的本机库 由于某种原因 如果将其他 jar 库编译到项目中 则本机库将不会加载 因此 如果我仅使用本机库运行应用程序 则一切正常
  • 如何让图片连续旋转? [关闭]

    很难说出这里问的是什么 这个问题模棱两可 含糊不清 不完整 过于宽泛或言辞激烈 无法以目前的形式合理回答 如需帮助澄清此问题以便重新打开 访问帮助中心 我的屏幕左上角有一个星星图像想要连续旋转 那么谁能告诉我如何让图片在 Mozilla F
  • 如何使用 FFT 绘制 wav 文件的频谱?

    注意 这不是重复的 除了相关问题之外 我还有其他特定要求 首先 我想绘制音频文件 wav 的频谱 就像 audacity 所做的那样 类似 如何从傅里叶变换绘制频谱 到目前为止我已经能够读取和写入 wav 文件了 但我的问题是我不确切知道需
  • python 函数中的动态默认参数

    我需要具有必须在函数运行时设置的默认参数的函数 例如空列表 从其他参数派生的值或从数据库获取的数据 我目前正在使用以下模式来处理此问题 def foo bar baz None baz baz if baz else blar Stuff
  • GHC 优化:Collat​​z 猜想

    我已经编写了代码欧拉计划的挑战 14 同时Haskell and C ideone 链接 他们都记得之前在数组中进行的任何计算 Using ghc O2 and g O3C 的运行速度分别比 Haskell 版本快 10 15 倍 虽然我知
  • 如何使用jquery检查复选框数组中的复选框是否被选中

    I have a html table with a column of text boxes mileage all of them are disabled when the page loads and I need that whe
  • Symfony 形式:上传的文件 - “该值应该是字符串类型”

    更新 2019 06 24 23 28 使用表单上传文件时 遇到以下错误 该值应该是字符串类型 表单生成器设置为FileType正如它应该 FormType class DocumentType extends AbstractType p
  • sbt 程序集错误:重复数据删除:在 io.netty.versions.properties 中找到不同的文件内容

    我已将以下罐子添加到build sbt文件如下 com amazonaws aws java sdk 1 11 492 发布此信息 在合并期间 我收到以下错误 error 1 error was encountered during mer
  • 为什么Global.asax.cs中的Session_Start会导致性能问题?

    当我在 Global asax cs 中创建一个空的 Session Start 处理程序时 在将页面渲染到浏览器时会导致严重的影响 如何重现 创建一个空的 ASP NET MVC 3 Web 应用程序 我使用的是 MVC 3 RC2 然后