14

我们在 AcquireRequestState 中花费大量时间处理了大量的 ajax 调用,在旅行中我们偶然发现了 ASP.Net 中的会话锁定 gem,因此我们实现了一个自定义会话状态处理程序(基于下面的链接)。

在进行更改并部署后,我们看到 AcquireRequestState 急剧下降,但它已被 PreExecuteRequestHandler 取代。

今天早上我突然意识到我们已经包含了 OWIN,这可能是 PreExecuteRequestHandler 占用这么多时间的原因。然后我继续删除它,在我部署代码的那一刻,PreExecuteRequestHandler 从列表中消失了。可悲的是,它现在再次以几乎完全相同的成本被 AcquireRequestState 取代。

尽管吞吐量更高,但我们似乎确实在返回 Partial 视图的 AJAX 调用、返回原始类型或 JSON 对象的 AJAX 调用上受到了很大的影响。

因此,这给我留下了 3 个问题,我完全被难住了,我认为其中一个的答案会引导我们找到另外 2 个的答案。

1) 为什么在安装 OWIN 时,成本会从 AcquireRequestState 转移到 PreExecuteEventHandler?OWIN 上是否有标记为 IRequireSessionState 的内容?(据我了解,AcquireRequestState 应该在托管管道中更早发生)

2) 我们如何获得更多关于 AcquireRequestState 内部实际情况的信息?或者我们的时间是否更好地用于返回 JSON 对象并使用它在 UI 上呈现我们需要的内容?

3)我们确实看到了一些映射到 New Relic 中的 /{controller}/{action}/{id} 的请求(尽管很少),然后在上述请求期间完全卡住了。尽管对我们的路由设置了限制,仅路由到我们在项目中拥有的控制器和操作。

PS:这似乎与以下非常相似,我们也在 New Relic 中看到了这一点:AcquireRequestState 中的长时间延迟

来自的自定义会话模块: 我刚刚发现为什么所有 ASP.Net 网站都很慢,我正在尝试解决此问题

4

2 回答 2

2

对于任何试图排除我们最终在上面遇到的会话问题,但仍然需要依赖会话值的人(因此您不能只在控制器级别禁用会话),请查看以下会话状态提供程序:

https://github.com/aspnet/AspNetSessionState

特别要确保您注意以下应用程序设置:

<add key="aspnet:AllowConcurrentRequestsPerSession" value="[bool]"/>

您将需要升级到 .Net Framework 4.6.2,但在我们的例子中,这是一个很小的代价。

于 2019-03-25T05:38:57.513 回答
0

我很清楚获取状态延迟 - 默认会话提供程序允许每个用户一次请求一个请求,它保持会话锁定,直到处理请求。有很多方法可以解决这个问题,但我知道这一切都得到了照顾。我想知道是否有人对问题 1、2 和 3 有答案。

于 2021-10-20T17:39:27.063 回答