BeginProcessRequest() 中会发生什么?

2024-01-08

我们使用 NewRelic 来提供服务器端应用程序跟踪。

我们注意到,我们的一些应用程序在该方法中始终花费大约 100 毫秒System.Web.Mvc.MvcHandler.BeginProcessRequest().

这种情况发生在调用任何自定义控制器代码之前(单独记录,而不是累积记录) - 目前尚不清楚为什么会在此方法中花费如此多的时间。

MVC 在这个方法中会做哪些事情?这可能只是请求排队吗?

[EDIT:] 正如所怀疑的那样 - Scalayer 下面的回答是正确的。我们删除并优化了所有会话依赖项,并看到应用程序可扩展性和稳定性大幅提高


您可能会看到的通常称为 .NET 中的线程敏捷性。

您可能会看到主题标签下的结果(即应用程序代码System.Web.HttpApplication.BeginRequest()) 是线程敏捷性问题;在大多数情况下,您在这里看到的时间不一定是正在执行的代码,而是 Web 上下文正在等待线程从读写锁释放回它。

The Application_BeginRequest()“暂停”在 ASP.NET Web 堆栈中非常普遍。一般来说,当您在 BeginRequest 中看到较长的加载时间时,您正在处理 ASP.NET 线程敏捷性和/或线程锁 - 特别是在处理 IO 和基于会话的操作时。这并不是一件坏事,这正是 .net 确保线程保持并发的方式。

时间间隔通常出现在 BeginRequest 和 PreRequestHandlerExecute 之间。如果应用程序正在向会话写入多个内容,则 ASP.NET 将发出读写锁HttpContext.Current.Session.

查看这是否是您可能面临的问题的一个好方法是检查线程 ID,看看敏捷性是否是一个问题 - 对于给定的请求,ID 会有所不同。

例如。在调试时,也许您可​​以将以下内容添加到您的Global.asax.cs:

protected void Application_BeginRequest(Object sender, EventArgs e) { 
      Debug.WriteLine("BeginRequest_" + Thread.CurrentThread.ManagedThreadId.ToString()); 
   }

打开调试输出窗口(从 Visual Studio:查看>>输出,然后从“显示输出”下拉列表中选择“调试”)。

调试时,点击一个您已经看到很长时间的页面。然后查看输出日志 - 如果您看到多个 id,那么您可能会遇到这种情况。

这就是为什么您有时可能会看到延迟,但有时却看不到延迟,应用程序代码使用会话的方式可能略有不同,或者会话或 IO 操作可能会因页面而异。

如果是这种情况,您可以采取一些措施来帮助加快速度,具体取决于站点或每个给定页面上会话的使用方式。

对于不修改会话的页面:

   <% @Page EnableSessionState="ReadOnly" %>

对于不使用会话状态的页面:

<% @Page EnableSessionState="False" %>

如果应用程序不使用会话(web.config):

<configuration>
    <system.web>
      <sessionState mode="Off" />
    </system.web>
</configuration>

让我们看下面的例子:

用户加载一个页面,然后决定在第一个请求完成之前转到另一个页面,加载 ASP.NET 将强制会话锁定,导致新页面请求加载等待第一个页面请求完成。使用 ASP.NET MVC,每个操作都会锁定用户会话以进行同步;导致同样的问题。

释放锁所花费的所有时间都将通过 new relic 报告,更不用说用户放弃会话并且返回的线程正在寻找不再存在的用户的时间。

顺便说一句,UpdatePanel 控件会导致相同的行为 -

http://msdn.microsoft.com/en-us/magazine/cc163413.aspx http://msdn.microsoft.com/en-us/magazine/cc163413.aspx

可以做什么:

这个锁定问题是 Microsoft 拥有 SessionStateUtility 类的原因之一 -

http://msdn.microsoft.com/en-us/library/system.web.sessionstate.sessionstateutility.aspx http://msdn.microsoft.com/en-us/library/system.web.sessionstate.sessionstateutility.aspx

这样,如果您遇到此问题,您可以覆盖默认行为,如下所示 Redis实现:https://github.com/angieslist/AL-Redis https://github.com/angieslist/AL-Redis

基于 .net 的网站使用的默认状态提供程序有很多选项。但通常知道此事务时间表示线程正在被锁定并等待服务器的请求完成。

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

BeginProcessRequest() 中会发生什么? 的相关文章

  • C++ 中的单例和抽象基类

    最近我遇到了关于实现 Singleton 但涉及抽象基类的问题 假设我们有这样的类层次结构 class IFoo it s ABC class Foo public IFoo 我们的单例类定义如下 template
  • 避免集合已修改错误

    Issue 我有以下代码 foreach var ItemA in GenericListInstanceB ItemA MethodThatCouldRemoveAnyItemInGenericListInstanceB 显然我得到一个错
  • 如何“杀死”Pthread?

    我正在学习 Pthreads 并且想知道杀死这样一个对象的最佳方法是什么 在寻找类似的问题后 我无法找到 明确 的答案 但请随时向我指出任何相关问题 我正在使用一个小型客户端服务器应用程序 其中服务器主线程正在侦听套接字上的客户端连接 每次
  • 如何从 List 中的字符串中删除数字/数字?

    我有一个字符串列表 List
  • Entity Framework 4.1 RC:Code First EntityTypeConfiguration 继承问题

    我尝试使用通用的 EntityTypeConfiguration 类来配置所有实体的主键 以便每个派生的配置类不会重复自身 我的所有实体都实现一个公共接口 IEntity 它表示每个实体必须有一个 int 类型的 Id 属性 我的配置基类如
  • C++ 私有静态成员变量

    此 C 代码在编译时产生链接器错误 A h class A public static void f private static std vector
  • AJAX控制工具包加载所有脚本

    我有一个奇怪的问题 我似乎无法解决 我正在使用 AJAX 控制工具包日历延长器在我的一些页面上 尽管我通过网络找到了信息 但我似乎无法让它与常规程序一起工作ScriptManager控制 它only与一个ToolkitScriptManag
  • C++ 中的 Java ArrayList [重复]

    这个问题在这里已经有答案了 在Java中我可以做 List
  • 以标准用户身份打开默认浏览器 (C++)

    我目前正在使用 ShellExecute 打开 在用户浏览器中打开 URL 但在 Win7 和 Vista 中遇到了一些麻烦 因为该程序作为服务运行提升 当 ShellExecute 打开浏览器时 它似乎读取 本地管理员 配置文件而不是用户
  • 在 ncurses 中使用退格键

    我设置了一个简单的 ncurses 程序 它使用 getch 一次读取一个字符并将它们复制到缓冲区中 我遇到的问题是检测到按下退格键 这是相关代码 while buffer i c getch EOF i if c n break else
  • .Net Core 中的脚手架以及解决方案中的多个项目

    我创建了一个针对 net461 的 Net Core MVC6 应用程序 我使用了一个我非常熟悉的项目结构 其中我将数据 模型和服务类放置在单独的类库项目中 并且 Web 项目引用这些项目 当我尝试搭建控制器时 我收到一条错误 指出我正在搭
  • Qt mouseReleaseEvent() 未触发?

    我有一个显示图片的库 我们称之为 PictureGLWidget 其中 class PictureGLWidget public QGLWidget 所以 PictureGLWidget 扩展了 QGLWidget 在PictureGlWi
  • 使用互斥锁来阻止临界区外部的执行

    我不确定我的术语是否正确 但这里是 我有一个由多个线程使用的函数来写入数据 在注释中使用伪代码来说明我想要的内容 these are initiated in the constructor int data std atomic
  • C 的“char”使用什么字符集? [复制]

    这个问题在这里已经有答案了 简单的问题 我最近开始用 C 编程 有一个简单的问题 C 编程语言在其 char 类型中使用什么字符集 例如 ASCII 还是取决于软件 操作系统 char 本质上是 1 个字节 主要在所有操作系统上 所以默认情
  • 如何从代码隐藏中向我的 div 添加点击事件?

    如何从代码隐藏中向我的 div 添加点击事件 当我点击 div 时 会出现一个消息框 其中显示 您想删除它吗 并在框中显示 是 或 否 全部来自后面的代码 while reader Read System Web UI HtmlContro
  • 如何解释“错误C2018:未知字符'0x40'?[关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 在编译一些代码时 我收到以下信息 错误 C2018 未知字符 0x40 我想知道如何解决这样的问题 这是我要开始的地方
  • 如何分析 VSCode 中函数的性能

    我用 C Golang 编写了一个程序 如何找到占用最高 CPU 周期的函数 目的是提高正在执行的程序的性能 2021 年 10 月 金香儿哈娜 https github com hyangah宣布 tweet https twitter
  • double 类型的静态类成员的常量表达式初始值设定项

    在 C 11 和 C 14 中 为什么我需要constexpr在下面的代码片段中 class Foo static constexpr double X 0 75 而这会产生编译器错误 class Foo static const doub
  • 编译器可以报告未知属性的错误吗?即使有范围?

    在N3291 7 6 1 3 5 属性语法和语义 decl attr grammar 关于如何属性是用我读过的源代码写的 使用一个属性范围令牌是有条件支持的 实现定义的行为 and For an 属性标记本国际标准中未指定 该行为是实现定义
  • 更改 Xamarin 中 ListView 所选项目的背景颜色

    我在 Xamarin 中创建了一个主从类型项目 当我从主页中选择一个项目时 背景颜色默认为橙色 我怎样才能将其更改为我选择的颜色 此问题是 Android 特有的 在 Android 项目中将此行添加到 Resources values s

随机推荐

  • “创建用户”怎么写?使用 MySQL 准备好的语句

    I tried SET user foo localhost SET pass bar SET sql CREATE USER IDENTIFIED BY PREPARE stmt FROM sql 我得到错误 ERROR 1064 420
  • FastAI lrfind()方法无法正常工作

    Update 1 我根据 无论坡度如何 你都希望从该点返回 10 倍 更新了我的 lr 并将其设置为 max lr 切片 1e 3 1e 2 这就是我得到的 和情节 这是什么意思 正如您在第二张图中看到的那样 从 1e 08 开始损失就非常
  • 为什么 JUnit 中不推荐使用assertEquals(double,double)?

    我想知道为什么assertEquals double double 已弃用 I used import static org junit Assert assertEquals 我使用的是 JUnit 4 11 下面是我的代码 import
  • 返回指向本地结构的指针

    我看到一些具有如下结构的代码示例 type point struct x y int func newPoint point return point 10 20 我有 C 背景 这对我来说似乎是错误 这种构造的语义是什么 新的点是分配在栈
  • 在行内插入表格

    我编写了一个包含两个表的脚本 tbl1是一个主表 tbl2是我想插入到的第二个表tbl1第二行使用纯JavaScript 它工作完美 但是我的tbl2有一些html attribute 插入后看到代码时没有看到 note tbl1 and
  • 如何用 PHP 解析 phpDoc 风格的注释块?

    请考虑以下代码 我尝试仅解析文件中的第一个 phpDoc 样式注释 不使用任何其他库 出于测试目的 将文件内容放入 data 变量中 data file A lot of info about this file Could even co
  • 为包含集合的对象实现 GetHashCode()

    考虑以下对象 class Route public int Origin get set public int Destination get set 路由实现相等运算符 class Routing public List
  • 术语“Update-Database”未被识别为 cmdlet 的名称

    我正在使用 EF5 beta1 虽然我之前能够运行 更新数据库 现在我关闭了 Visual Studio 我无法让它运行 我收到以下错误 术语 更新数据库 不被识别为 cmdlet 函数 脚本文件或可操作程序的名称 检查名称的拼写 或者如果
  • 解释 sed、grep 和 cut 语法

    我正在分析一个批处理文件 其中有一行编辑文本文件 输入 并制作 txt 文件 输出 该批处理使用三个帮助tools exe grep sed and cut 我尝试阅读他们的使用手册 但这并不容易 该行是 type input txt se
  • 带有“-std=c++0x”的“#include ”已损坏

    如果我指定 std c 0x到 g 那么我不能 include
  • CSS 性能和实现较少

    将 LESS 用于 CSS 的最佳方法是什么 基本上 开发人员应该编写一个 Less 文件 然后将其编译用于生产 我应该链接 LESS 代码和 javascript 文件吗 或者我应该完全跳过 LESS 路线并重新制作课程 我正在尝试将一些
  • 如何使用 HTML 父子关系中的 2 个 Svelte 组件将数据从子级传递到父级

    我是 Svelte 的新手 我在 HTML 父子关系中有 2 个 Svelte 组件 而不是 Svelte P C 关系 其中 1 个 Svelte 组件导入另一个组件 最终 我想要这样的东西 可能有很多 Accs
  • 如何在elasticsearch中使用Query DSL找到最近/最近的数字

    我正在寻找在弹性搜索的帮助下找到最近的价格 号码的可能性 问题是我没有范围 我想要实现的是结果按最近距离排序 根据示例搜索查询 我的索引包含 3 个文档 其价格 数字 如下 45 27 32 对于给定数字 距我的搜索值 29 的 距离 是
  • 谷歌搜索网络抓取与Python中的关键字列表

    我正在尝试通过使用名称列表作为输入并在 DataFame 中获取数据集来在 Google 搜索上进行网络抓取 我之前使用 selenium 进行网页抓取 但我在构建语法时遇到了困难使用循环运行名称列表作为输入得到结果并scrape每一页 下
  • 防止创建类型别名实例

    是否可以阻止创建类型别名的实例 例如一个ValidatedEmail type ValidatedEmail address string validatedOn Date 假设有一个函数validateEmail和一个函数sendEmai
  • 使用 SynchronizationContext 将事件发送回 WinForms 或 WPF 的 UI

    我使用 SynchronizationContext 将事件从执行大量多线程后台任务的 DLL 封送回 UI 线程 我知道单例模式不是我最喜欢的 但是当您创建 foo 的父对象时 我现在使用它来存储 UI 的 Synchronization
  • 获取存储为字符的时间变量的时间差

    我的数据框中有两个字符变量start time and stop time start time stop time
  • jQuery flot 并排多条形图

    我使用 jQuery 绘图和类别插件来创建图表 我想使用以下代码并排绘制每个月的两个条形图 plot chart label Neue Mitglieder data data order 1 label F llige K ndigung
  • 如何在eclipse中过滤消息到Logcat?

    我只想从当前运行的应用程序向 logcat 显示 system out println 消息 我已经检查了堆栈溢出和其他人的许多建议 但我得到的只是像 add adb d logcat com example example I S 等等
  • BeginProcessRequest() 中会发生什么?

    我们使用 NewRelic 来提供服务器端应用程序跟踪 我们注意到 我们的一些应用程序在该方法中始终花费大约 100 毫秒System Web Mvc MvcHandler BeginProcessRequest 这种情况发生在调用任何自定