Могу ли я запустить MVC Mini Profiler в методе PostAuthorizeRequest? - PullRequest
4 голосов
/ 29 августа 2011

Я использую MVC Mini Profiler и показываю профилировщик только для аутентифицированных пользователей с ролью «Профилировщик». Пример доставки в MiniProfiler.cs использовал метод AuthenticateRequest, чтобы определить, следует ли прекратить профилирование, но я переключился на использование PostAuthorizeRequest (после прочтения этот вопрос ), чтобы получить доступ к 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 ]

5 голосов
/ 30 августа 2011

Вы можете отказаться от результатов профилирования в любое время, используя вызов:

MiniProfiler.Stop(discardResults: true);

В StackOverflow наш шаблон «высокой производительности»:

  1. Напишите «секретный» cookie для всех авторизованных аутентифицированных пользователей.
  2. Если вы найдете файл cookie в Application_BeginRequest - MiniProfiler.Start ();
  3. После PostAuthorizeRequest:

if (MiniProfiler.Current != null && !userReallyAuthenticated) 
    MiniProfiler.Stop(discardResults: true);

Ваша цель - начать профилирование как можно раньше и прекратить профилирование как можно позже. Если вы начинаете только с середины конвейера, части конвейера, где могут находиться узкие места, не будут профилироваться.

1 голос
/ 29 августа 2011

Я думаю, что запуск профилировщика как можно раньше важен (в противном случае вы могли бы пропустить некоторую ключевую информацию, например, если сам процесс аутентификации занимает некоторое время, или если какой-то модуль HTTP имеет проблемы).

Поскольку событие BeginRequest наступает раньше, чем что-либо еще происходит с запросом, это делает его идеальным местом для начала профилирования, а затем решите, хотите ли вы сохранить профилированные данные на более позднем этапе (PostAuthorize, в вашем случай).

...