Могу ли я запустить MVC Mini Profiler в методе PostAuthorizeRequest?

Я использую 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();
    };
}

person Austin    schedule 29.08.2011    source источник


Ответы (2)


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

MiniProfiler.Stop(discardResults: true);

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

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

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

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

person Sam Saffron    schedule 29.08.2011
comment
Итак, вы запускаете профилировщик только при наличии файлов cookie (которые могут быть установлены при входе в систему), а затем выполняете настоящую проверку в PostAuthorizeRequest. - person Austin; 30.08.2011
comment
@ Остин ... да ... это наименее удачный способ - person Sam Saffron; 31.08.2011
comment
Большое спасибо! Мне очень нравится MiniProfiler, невероятно полезный. - person Austin; 31.08.2011

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

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

person Kyle Trauberman    schedule 29.08.2011
comment
В этом есть смысл, меня беспокоит то, что большинство моих пользователей не увидят профилировщик, и поэтому мне интересно, сколько накладных расходов приведет к запуску профилировщика от BeginRequest до PostAuthorizeRequest. - person Austin; 30.08.2011
comment
У меня нет подробностей о накладных расходах, но я очень сомневаюсь в этом, особенно если вы отбрасываете профилированные данные при остановке профилировщика (я думаю, передать true методу Stop ()). - person Kyle Trauberman; 30.08.2011
comment
Вы всегда можете профилировать профилировщик, чтобы получить профилированные данные о профилированных данных профилировщика. - person Kyle Trauberman; 30.08.2011