MiniProfiler не может отображать SqlTimings - PullRequest
2 голосов
/ 22 ноября 2011

Я использую MiniProfiler для профилирования приложения MVC и служб WCF, это работает как очарование с одним предупреждением - когда информация профиля содержит sql.

Симптомы:

  1. Во всплывающем окне отсутствует заголовок «Время запроса (мс)»
  2. "% в sql" также отсутствует в нижней части всплывающего окна
  3. Если я нажимаю на ссылки "sql", отображается серое наложение, но нет информации и выдается ошибка jQuery (не удается найти элемент).

После небольшого копания я обнаружил, что все это связано с HasSqlTimings в ответе json существует несоответствие между HasSqlTimings (false) в корне ответа json и информацией, которая находится в Root / Детская иерархия (правда).

[OnDeserialized]
void OnDeserialized(StreamingContext ctx)
{
    HasSqlTimings = GetTimingHierarchy().Any(t => t.HasSqlTimings);
    HasDuplicateSqlTimings = GetTimingHierarchy().Any(t => t.HasDuplicateSqlTimings);

    if (_root != null)
    {
        _root.RebuildParentTimings();
    }
}

Я посмотрел на источник, и похоже, что он должен работать просто отлично, но без сделки! Кто-нибудь знает, где я могу пойти не так?

1 Ответ

0 голосов
/ 22 ноября 2011

У меня была такая же проблема при реализации этого.Проблема возникает, когда уровень пользовательского интерфейса не делает никаких вызовов SQL, но затем данные WCF возвращаются с вызовами SQL.Корневой таймер не знает, что в иерархии ниже есть тайминги sql.

Я добавил одну строку, чтобы при добавлении «удаленных» таймингов мы устанавливали поле «hasSqlTimings», чтобы пользовательский интерфейс знал, как правильно отображать блок.Вот код, который я изменил в MvcMiniProfiler \ MiniProfiler.cs:

/// <summary>
/// Adds <paramref name="externalProfiler"/>'s <see cref="Timing"/> hierarchy to this profiler's current Timing step,
/// allowing other threads, remote calls, etc. to be profiled and joined into this profiling session.
/// </summary>
public static void AddProfilerResults(this MiniProfiler profiler, MiniProfiler externalProfiler)
{
   if (profiler == null || externalProfiler == null) return;
   profiler.Head.AddChild(externalProfiler.Root);
   profiler.HasSqlTimings = profiler.GetTimingHierarchy().Any(t => t.HasSqlTimings);
}
...