我在分布式ASP.NET Web应用程序中有一个异步处理程序的问题.首先让我解释一个用例:
应用程序通过web.config禁用了会话和身份验证模块
<system.webServer>
....
<modules>
<remove name="WindowsAuthentication" />
<remove name="Session" />
<remove name="FormsAuthentication" />
</modules>
</system.webServer>
Run Code Online (Sandbox Code Playgroud)应用程序使用自定义异步Web处理程序来提供特定请求
所有正常(同步请求)都正常工作,但执行更多工作的异步请求(这就是我们使用异步请求的原因)通常很慢,但NewRelic报告说它因"AcquireRequestState"而变慢.现在我看了谷歌和堆栈溢出,这个事件连接到创建一个会话,但我们在web.config中禁用了会话.有谁知道"AcquireRequestState"还能做什么?我们是否遗漏了删除会话状态的地方?从web.config添加到machine.config没有做任何事情......
以下是NewRelic中请求的片段:
**Slowest components Count Duration % **
AcquireRequestState 1 12,600 ms 100% --> WTF?
ExecuteRequestHandler 1 5.01 ms 0%
Integrated Pipeline 1 0.334 ms 0%
UpdateRequestCache 1 0.3 ms 0%
EndRequest 1 0.168 ms 0%
AuthenticateRequest 1 0.161 ms 0%
Total time 12,600 ms 100%
Run Code Online (Sandbox Code Playgroud)
编辑:我<sessionState mode="Off" />在web.config(<system.web>部分),所以这不是它.
我们在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中看到了这一点:AcquireRequestState中的长时间延迟
自定义会话模块来自: 我刚刚发现为什么所有ASP.Net网站都很慢,我正在尝试解决该怎么做