заставить mvc-mini-profiler показывать некоторые данные всем пользователям

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

Подойдет ли мини-профилировщик MVC или мне просто добавить секундомеры на сайт? Мы используем Solr для нашего бэкенда, поэтому я хотел бы иметь возможность сказать: «Solr получил результаты за x миллисекунд, и мы отобразили страницу за y миллисекунд», что мы можем сделать (в некоторой степени) на данный момент, но только для разработчиков. .. мы можем получить эти числа от профилировщика, а затем отобразить их самостоятельно, или я иду здесь не по тому дереву?


person TiernanO    schedule 10.11.2011    source источник


Ответы (1)


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

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

/// <summary>
/// Filter to display the execution time of both the action and result
/// </summary>
public class RequestTimingFilterAttribute : ActionFilterAttribute
{
    /// <summary>
    /// Returns a Stopwatch instance for the specific context to gather
    /// diagnostics timing for
    /// </summary>
    /// <param name="context"></param>
    /// <param name="name"></param>
    /// <returns></returns>
    private static Stopwatch GetTimer(ControllerContext context, string name)
    {
        var key = string.Format("__timer__{0}", name);
        if (context.HttpContext.Items.Contains(key))
        {
            return (Stopwatch)context.HttpContext.Items[key];
        }

        var result = new Stopwatch();
        context.HttpContext.Items[key] = result;
        return result;
    }

    /// <summary>
    /// Called before an action method executes.
    /// </summary>
    /// <param name = "filterContext">The filter context.</param>
    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        GetTimer(filterContext, "action").Start();
    }

    /// <summary>
    /// Called after the action method executes.
    /// </summary>
    /// <param name = "filterContext">The filter context.</param>
    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
        GetTimer(filterContext, "action").Stop();
    }

    /// <summary>
    /// Called before an action result executes.
    /// </summary>
    /// <param name = "filterContext">The filter context.</param>
    public override void OnResultExecuting(ResultExecutingContext filterContext)
    {
        GetTimer(filterContext, "render").Start();
    }

    /// <summary>
    /// Called after an action result executes.
    /// </summary>
    /// <param name = "filterContext">The filter context.</param>
    public override void OnResultExecuted(ResultExecutedContext filterContext)
    {
        var renderTimer = GetTimer(filterContext, "render");
        renderTimer.Stop();

        var actionTimer = GetTimer(filterContext, "action");
        var response = filterContext.HttpContext.Response;

        if (response.ContentType == "text/html")
        {
            response.Write(
              string.Format(
                "<div style='font-size: 70%; font-weight: bold; color: #888;'>Action '{0} :: {1}'<br /> Execute: {2}ms, Render: {3}ms.</div>",
                filterContext.RouteData.Values["controller"],
                filterContext.RouteData.Values["action"],
                actionTimer.ElapsedMilliseconds,
                renderTimer.ElapsedMilliseconds
                )
              );
        }
    }
}
person adammokan    schedule 10.11.2011
comment
спасибо за код. очень кстати. Постараюсь внедрить это ... Прежде чем я начну его использовать, не мешает ли это мини-профилировщику? Спасибо. - person TiernanO; 11.11.2011
comment
Нет. Это не должно влиять на мини-профилировщик. Это просто MVC ActionFilter, который фиксирует время начала/окончания действия/результата и отображает дельты на вашей странице. Это может отображаться в профиле выполнения на мини-профилировщике, но это все. - person adammokan; 14.11.2011
comment
Удачи с экшен-фильтром? - person adammokan; 27.12.2011
comment
Код ActionFilter вверху работает отлично, просто возникают проблемы с попыткой вывести его в правильном месте (выводит ПОСЛЕ закрывающего тега HTML в текущей форме... нужно настроить его). но работает по плану. - person TiernanO; 27.12.2011
comment
Ага. Я никогда не занимался этим, но, возможно, стоит убрать жестко закодированную информацию о стиле из выходной разметки и просто указать идентификатор тега div. Тогда вы, вероятно, могли бы использовать CSS для его перемещения или использовать jQuery для переключения отображения? Просто идея. - person adammokan; 27.12.2011