我可以在PostAuthorizeRequest方法中启动MVC Mini Profiler吗?

时间:2011-08-29 18:26:06

标签: c# asp.net asp.net-mvc mvc-mini-profiler

我正在使用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();
    };
}

2 个答案:

答案 0 :(得分:5)

您可以随时使用此功能放弃分析结果:

MiniProfiler.Stop(discardResults: true);

在StackOverflow,我们的“高性能”模式是:

  1. 为所有经过授权的经过身份验证的用户写一个“秘密”cookie。
  2. 如果您在Application_BeginRequest - MiniProfiler.Start();
  3. 中找到了Cookie
  4. PostAuthorizeRequest之后:
  5. 
    if (MiniProfiler.Current != null && !userReallyAuthenticated) 
        MiniProfiler.Stop(discardResults: true);
    

    您的目标始终是尽早开始分析,并尽可能晚地停止分析。如果您只是从管道中间开始,那么管道中可能存在瓶颈的部分将不会被分析。

答案 1 :(得分:1)

我认为尽早启动探查器非常重要(否则您可能会丢失一些关键信息,例如,如果身份验证过程需要一段时间,或者某些HTTP模块有问题)。

由于BeginRequest事件发生在请求发生的任何其他事件之前,这使得它成为开始分析的理想位置,然后决定是否要在稍后的步骤中保留分析数据({{1}在你的情况下)。