我在分布式ASP.NET Web应用程序中遇到一个异步处理程序的问题。首先让我解释一个用例:
应用程序已通过web.config禁用会话和身份验证模块,如此
<system.webServer>
....
<modules>
<remove name="WindowsAuthentication" />
<remove name="Session" />
<remove name="FormsAuthentication" />
</modules>
</system.webServer>
应用程序使用自定义异步Web处理程序来提供特定请求
所有正常(同步请求)都正常工作,但执行更多工作的异步请求(这就是我们使用异步请求的原因)通常很慢,但NewRelic报告说它很慢,因为&#34; AcquireRequestState& #34 ;.现在,我已经查看了google和堆栈溢出,此事件与创建会话相关,但我们在web.config中禁用了会话。有谁知道还有什么可以&#34; AcquireRequestState&#34;可能会这样做?我们是否遗漏了删除会话状态的地方?将它从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%
编辑:
我在web.config(<sessionState mode="Off" />
部分)中有<system.web>
,所以不是这样。
答案 0 :(得分:1)
我已经调查了这个,因为我们有类似的问题,我发现这个forum post,有趣的答案是:
不幸的是,问题并不像关闭sessionState那么简单。实际上,在使用AcquireRequestState描述挑战时,其中一个关键短语是短语,例如,当提到此事件时会话状态。在深入研究这个(实际上看.NET源代码)时,我们可以看到在执行EventHandler或创建RequestNotification对象时调用它。我敢说有其他方法和/或事件,当被调用时,将引发AcquireRequestState事件。追踪所有这些代表着一种挣扎。在更规范化的会话状态讨论之外,这似乎没有被谈论过很多东西。 我们看到这个事件最常见的地方肯定与会话状态管理有关。但是有很明显的异常值,这些事件仍然可以提出。它甚至可以直接从应用程序代码调用。代理人所要解决的问题是它可以识别事件,但很少能识别事件。当它作为ASP管道的一部分被引发时,代理获得的唯一通知是这是事务的一个部分。事件中执行的源或方法是代理在默认情况下很少使用的东西。 我希望我们能为您提供更多见解。 .NET应用程序中有许多移动部件,其中一些涉及操作系统本身,IIS,.NET版本,方法是否异步,应用程序池设置,执行模式,权限等。 虽然我不想在这里打开第二个蠕虫病毒,但是由于缺少500个错误的堆栈跟踪问题。代理在提供和/或可用时提供堆栈跟踪。在ASP管道中发生堆栈跟踪(如果存在的话)非常重要。有时它会在执行任何实际应用程序代码之前发生。在这种情况下,会向应用程序报告错误,从而让.NET代理查看并报告发生了错误,但未提供其他详细信息。代理只是看到它发生并报告尽可能多的信息。除此之外,代理商根本没有提供进一步的细节。
我们放弃了,所以我有兴趣知道你是否弄清楚了!
答案 1 :(得分:0)
Profile Module也使用了AcquireRequestState。你试过禁用吗?
<modules>
<remove others unwanted modules... />
<remove name="Profile" />
</modules>
答案 2 :(得分:0)
所以我有同样的问题。我有很多并发的ajax请求,所有使用的变量都存储在ASP.NET ClaimsIdentity中,使用SessionState可以有效地进行此操作。这意味着,很多服务器响应时间只是在等待SessionState解锁。
我通过减小锁定轮询间隔来解决它:
var months=new[]{ "2020M01" ,"2019M12","2020M03"};
var latestMonth=months.Max();
var earliestMonth=months.Min();
以上解决方案已在this blog article
中披露