Как спрятать минипрофилер? - PullRequest
       16

Как спрятать минипрофилер?

11 голосов
/ 30 сентября 2011

Я использую профилировщик MVC Mini для проверки скорости определенных частей моего приложения и хотел бы сохранить ее там на случай, если что-то случится позже, и мне может понадобиться проверить «что происходит не так». Это не полный набор журналов, но очень полезно знать, что заставляет страницу занимать много времени.

Итак, моя цель - скрыть это и сделать его профилированным только тогда, когда запрос приходит с определенным параметром. Однако ни одна из моих попыток не сработала так, как я ожидал.

Это позволило избежать его отображения на экране (код в виде):

@if (Request.QueryString.AllKeys.Contains("showProfiler"))
{ 
    @MvcMiniProfiler.MiniProfiler.RenderIncludes()
}

Это попытка, которая стала ближе. Правильно скрывает информацию о мини-профилировщике, но в тот момент, когда я ее показываю, все профилируется, так как я перестал ее показывать. Итак, допустим, что я профилирую свою страницу, и это занимает 3 секунды. Я удаляю параметр запроса и загружаю страницу еще три раза. Я снова добавляю свой параметр и вижу 4 набора информации профиля. Это означает, что он отслеживает все, и мне интересно, может ли это привести к проблемам с памятью.

Попытки сделать так, чтобы этого больше не происходило:

Попытка 1:

protected void Application_BeginRequest()
{
    if (Request.QueryString.AllKeys.Contains("showProfiler"))
    {
        MiniProfiler.Start();
    }
}

Попытка 2:

protected void Application_EndRequest()
{
    MiniProfiler.Stop(!Request.QueryString.AllKeys.Contains("showProfiler"));
}

Попытка 3:

protected void Application_EndRequest()
{
    MiniProfiler.Stop(true);
}

Ничего из этого не сработало. Есть идеи?

Ответы [ 3 ]

13 голосов
/ 30 сентября 2011

Домашняя страница (см. Раздел «Отказ от сеанса профилировщика») профилировщика имеет шаблон использования, который ищется:

protected void Application_BeginRequest()
{
   MvcMiniProfiler.MiniProfiler.Start();  
}
protected void Application_AuthenticateRequest(Object sender, EventArgs e)
{
   if(!CurrentUserIsAllowedToSeeProfiler())
   {
       MvcMiniProfiler.MiniProfiler.Stop(discardResults: true);
   }
}

Ваша реализация CurrentUserIsAllowedToSeeProfiler будет проверять, содержит ли строка запроса ключ триггера профилировщика.


EDIT :

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

Исходя из этого, похоже, что "Попытка # 1" должна быть уловкой. Обратите внимание, что разница между «близким» и «попыткой № 1» заключается в том, что первый ищет строку запроса profiling, тогда как ваша попытка № 1 проверяет showProfiler. Могло ли это быть просто смешивание строк запроса?

0 голосов
/ 05 ноября 2018

Я не нашел решения выше.

Для меня единственным решением было установить debug = "false" в Web.Config файл.

<compilation defaultLanguage="c#" debug="false" batch="false" targetFramework="4.5.2">

Надеюсь, это поможет и другим.

0 голосов
/ 30 сентября 2011

Просто запустите профилировщик, как обычно, в вашем событии начала запроса. Затем в вашем контроллере или представлении проверьте строку запроса и вызовите MiniProfiler.Stop(true), чтобы отбросить профилированные данные, если они не установлены или имеют значение false.

protected void Application_BeginRequest()
{
    MiniProfiler.Start();  
}

Тогда по вашему мнению:

@if(!Request.QueryString.AllKeys.Contains("profiling"))
{
    MiniProfiler.Stop(true);
}
...