AcquireRequestState vs PreExecuteRequestHandler

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

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

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

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

我们似乎在AJAX调用上非常努力地返回部分视图,AJAX调用返回原始类型或JSON对象似乎在很大程度上不受影响,尽管吞吐量更高。

所以这给我留下了3个问题,我绝对难以理解,我认为一个问题的答案会引导我们找到另外两个问题的答案。

1)为什么在安装OWIN时,成本从AcquireRequestState移动到PreExecuteEventHandler? OWIN上的东西是否标记为IRequireSessionState? (据我所知,AcquireRequestState应该在托管管道的早期发生)

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

3)我们确实看到一些请求(很少但是)在New Relic中映射到/ {controller} / {action} / {id},然后在上面提到的请求期间完全停留。尽管我们的路由设置限制只能路由到我们在项目中的控制器和操作。

PS:这看起来与以下内容非常相似,我们也在New Relic中看到这个:long delays in AcquireRequestState

自定义会话模块来自:I just discovered why all ASP.Net websites are slow, and I am trying to work out what to do about it

c# newrelic request-pipeline
1个回答
0
投票

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

https://github.com/aspnet/AspNetSessionState

具体请确保您注意以下应用程序设置:

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

您需要升级到.Net Framework 4.6.2,但在我们的情况下,这是一个很小的代价。

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