Mvc-Mini-Profiler: почему так много идентификаторов X-MiniProfiler? - PullRequest
5 голосов
/ 25 августа 2011

Я использую Mvc-Mini-Profiler (какой замечательный продукт!). При использовании моего обычного веб-браузера все работает нормально, но как только я использую свой собственный http-клиент (базовый http 1.1 без поддержки cookie), количество X-MiniProfiler-Ids в заголовке http увеличивается. Это происходит довольно быстро и становится довольно многочисленным за короткий промежуток времени (11 КБ и выше данных).

Может ли отсутствие файлов cookie заставить Mvc-Mini-Profiler работать таким образом или что-то не так с моей реализацией?

Ответы [ 2 ]

6 голосов
/ 28 августа 2011

Это по замыслу, я думаю.Хотя мы могли бы немного улучшить реализацию.

X-MiniProfiler-Ids необходимо "использовать", они отображаются только при включенном профилировании.Это работает потому, что вы можете профилировать POST и перенаправлять.

Мы, вероятно, должны установить там четкий верхний предел (например, около 20) - пожалуйста, опубликуйте ошибку для этого.

Однако, поскольку вы никогда не планируете использовать какие-либо блоки профилирования для своего HTTP-клиента, я бы рекомендовал отказаться от профилирования , если , useragent - ваш HTTP-клиент.

Это можно сделать, добавив условное выражение до:

// don't run if UserAgent is "my http client"
if(notMyUserAgent)
   MvcMiniProfiler.MiniProfiler.Start();  
1 голос
/ 27 октября 2011

Другим вариантом является переопределение класса SqlServerStorage и по умолчанию для поля UserHasViewed значение true.Это сведет строку X-MiniProfiler-Id к минимуму.

public class MvcMiniProfilerStorage : SqlServerStorage
{
    public MvcMiniProfilerStorage(string connectionString) : base(connectionString)
    {
    }

    /// <summary>
    ///     Stores  to dbo.MiniProfilers under its ;
    ///     stores all child Timings and SqlTimings to their respective tables.
    /// </summary>
    public override void Save(MiniProfiler profiler)
    {
        const string sql =
            @"insert into MiniProfilers
        (Id,
         Name,
         Started,
         MachineName,
         [User],
         Level,
         RootTimingId,
         DurationMilliseconds,
         DurationMillisecondsInSql,
         HasSqlTimings,
         HasDuplicateSqlTimings,
         HasTrivialTimings,
         HasAllTrivialTimings,
         TrivialDurationThresholdMilliseconds,
         HasUserViewed)
select       @Id,
         @Name,
         @Started,
         @MachineName,
         @User,
         @Level,
         @RootTimingId,
         @DurationMilliseconds,
         @DurationMillisecondsInSql,
         @HasSqlTimings,
         @HasDuplicateSqlTimings,
         @HasTrivialTimings,
         @HasAllTrivialTimings,
         @TrivialDurationThresholdMilliseconds,
         @HasUserViewed
where not exists (select 1 from MiniProfilers where Id = @Id)";
        // this syntax works on both mssql and sqlite

        using (DbConnection conn = GetOpenConnection())
        {
            int insertCount = conn.Execute(sql,
                new
                    {
                        profiler.Id,
                        Name = Truncate(profiler.Name, 200),
                        profiler.Started,
                        MachineName = Truncate(profiler.MachineName, 100),
                        User = Truncate(profiler.User, 100),
                        profiler.Level,
                        RootTimingId = profiler.Root.Id,
                        profiler.DurationMilliseconds,
                        profiler.DurationMillisecondsInSql,
                        profiler.HasSqlTimings,
                        profiler.HasDuplicateSqlTimings,
                        profiler.HasTrivialTimings,
                        profiler.HasAllTrivialTimings,
                        profiler.TrivialDurationThresholdMilliseconds,
                        // BUG: Too many X-MiniProfiler-Id headers cause
                        // Firefox to stop all requests
                        //
                        // This hack marks all entries as read so that
                        // they do not end up part of that header.
                        HasUserViewed = true
                    });

            if (insertCount > 0)
            {
                SaveTiming(conn, profiler, profiler.Root);
            }
        }
    }

    private static string Truncate(string s, int maxLength)
    {
        return s != null && s.Length >
                    maxLength ? s.Substring(0, maxLength) : s;
    }
}
...