我正在使用MVC Mini Profiler,我只是为处于“Profiler”角色的经过身份验证的用户展示了探查器。 MiniProfiler.cs中的示例运输使用AuthenticateRequest方法来确定它是否应该停止分析,但我切换到使用PostAuthorizeRequest(在阅读this question之后),以便我可以访问IPrincipal和IsInRole方法。我可以在PostAuthorizeRequest方法中启动探查器,还是应该继续停止并丢弃PostAuthorizeRequest中的结果?为每个请求启动和停止探查器的开销是多少?
当前代码:
public void Init(HttpApplication context)
{
context.BeginRequest += (sender, e) =>
{
MiniProfiler.Start();
};
context.PostAuthorizeRequest += (sender, e) =>
{
var user = ((HttpApplication)sender).Context.User;
if (user == null || !user.Identity.IsAuthenticated || !user.IsInRole("Profiler"))
{
MvcMiniProfiler.MiniProfiler.Stop(discardResults: true);
}
};
context.EndRequest += (sender, e) =>
{
MiniProfiler.Stop();
};
}
拟议守则:
public void Init(HttpApplication context)
{
context.PostAuthorizeRequest += (sender, e) =>
{
var user = ((HttpApplication)sender).Context.User;
if (user != null && user.Identity.IsAuthenticated && user.IsInRole("Profiler"))
{
MiniProfiler.Start();
}
};
context.EndRequest += (sender, e) =>
{
MiniProfiler.Stop();
};
}
答案 0 :(得分:5)
您可以随时使用此功能放弃分析结果:
MiniProfiler.Stop(discardResults: true);
在StackOverflow,我们的“高性能”模式是:
Application_BeginRequest
- MiniProfiler.Start(); PostAuthorizeRequest
之后:
if (MiniProfiler.Current != null && !userReallyAuthenticated)
MiniProfiler.Stop(discardResults: true);
您的目标始终是尽早开始分析,并尽可能晚地停止分析。如果您只是从管道中间开始,那么管道中可能存在瓶颈的部分将不会被分析。
答案 1 :(得分:1)
我认为尽早启动探查器非常重要(否则您可能会丢失一些关键信息,例如,如果身份验证过程需要一段时间,或者某些HTTP模块有问题)。
由于BeginRequest
事件发生在请求发生的任何其他事件之前,这使得它成为开始分析的理想位置,然后决定是否要在稍后的步骤中保留分析数据({{1}在你的情况下)。