在 ASP.NET Core 5 MVC 应用程序中,ControllerActionInvoker.InvokeActionAsync 方法似乎在同一线程中同时调用两次?

问题描述 投票:0回答:1

我使用 CLR 分析器以原始 APM 类型的方式记录框架方法。使用此功能时,请求流通常会流经我动态插入到应用程序中的中间件,然后流向请求处理程序。

在本例中,

ControllerActionInvoker
(ASP.NET Core 5 MVC),这里的请求线程与
InvokeActionAsync()
函数返回
Task
对象相同,并且任务在线程池中的单独线程上继续。但是,在第一个方法返回 Task 对象之前,如何在同一个线程中第二次触发
InvokeActionAsync()
呢?仅当负载较高时才会发生这种情况,否则请求流是可预测的。

日志如下:

13-11-2023 21:00:03 [4:(DEBUG)<t:23>] - [TName: ] MiddleWarePipeline.Invoke is called
13-11-2023 21:00:03 [4:(DEBUG)<t:23>] - [TName: ] Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeActionMethodAsync is called.
13-11-2023 21:00:03 [4:(DEBUG)<t:23>] - [TName: ] Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeActionMethodAsync is called.
13-11-2023 21:00:03 [4:(DEBUG)<t:23>] - [TName: ] ----- some other -----
13-11-2023 21:00:03 [4:(DEBUG)<t:23>] - [TName: ] ------functions ------
13-11-2023 21:00:03 [4:(DEBUG)<t:23>] - [TName: ] ------are getting-----
13-11-2023 21:00:03 [4:(DEBUG)<t:23>] - [TName: ] ----logged that ------
13-11-2023 21:00:03 [4:(DEBUG)<t:23>] - [TName: ] -------happen inside ----
13-11-2023 21:00:03 [4:(DEBUG)<t:23>] - [TName: ] ----that particular -----
13-11-2023 21:00:03 [4:(DEBUG)<t:23>] - [TName: ] ------action method-----
13-11-2023 21:00:03 [4:(DEBUG)<t:23>] - [TName: ] Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeActionMethodAsync has returned task obj.
13-11-2023 21:00:03 [4:(DEBUG)<t:23>] - [TName: ] Microsoft.AspNetCore.Mvc.Infrastructure.ControllerActionInvoker.InvokeActionMethodAsync has returned task obj.
13-11-2023 21:00:03 [4:(DEBUG)<t:23>] - [TName: ] MiddleWarePipeline.Invoke has returned  obj.

这是预期的行为吗?这是触发

InvokeActionAsync()
两次的同一个请求,还是两个请求?如果是两个,他们如何区分同一个线程中的两个请求?

asp.net-core-mvc load-testing asp.net-core-5.0 clr-profiling-api
1个回答
0
投票

请求线程与 InvokeActionAsync() 相同 函数返回一个 Task 对象,并且该任务在单独的 线程池中的线程。但是 InvokeActionAsync() 会如何 在第一个方法之前在同一个线程中触发第二次 甚至返回了任务对象,这是预期的行为吗?这是吗 同一请求触发 InvokeActionAsync() 两次,还是两次 要求?

首先,中间件执行两次并不是一个缺点。一般来说,这是执行中间件两次时的预期行为,因为执行 HTTP 请求时通常会命中两个端点。所以中间件执行了两次。

如果您调试应用程序,您会发现将执行第一个调用 InvokeActionAsync 以加载应用程序本身,基本路径应该是您的域/本地主机或

/

您的应用程序第二次拥有其资源文件。例如,CSS、JS 或应用程序根文件夹中需要额外执行的任何其他内部文件。

请查看以下网络跟踪日志:

注意: 但是,有时如果您没有通常在程序启动时调用的额外资源,则不希望在同一线程内针对同一请求多次调用此方法。例如,静态文件。

如果是两个,他们如何区分这两个请求 同一条线?

对于 ASP.NET Core,为了区分同一线程中的多个请求,它使用与每个请求关联的 HttpContext 对象。 HttpContext 包含有关当前请求的信息,包括标头、参数和其他相关详细信息。此上下文对于每个传入请求都是唯一的,它用于区分不同的请求,即使它们是在同一线程上处理的。

如果您需要更准确地了解为什么 InvokeActionAsync 在您的特定场景中被调用两次,您可以分析您的调用堆栈,在请求处理期间记录其他信息。

此外,在每次调用期间检查 HttpContext 可以帮助识别两次调用之间的任何差异

注意:如果您想了解更多如何查看httpContext详细信息和后台线程,请参考此官方文档

© www.soinside.com 2019 - 2024. All rights reserved.