Mvc-Mini-Profiler:为什么这么多X-MiniProfiler-Ids?

时间:2011-08-25 10:00:45

标签: mvc-mini-profiler

我正在使用Mvc-Mini-Profiler(这是一个很棒的产品!)。使用我的普通网络浏览器似乎一切正常,但只要我使用自己的http客户端(没有cookie支持的基本http 1.1),http标头中 X-MiniProfiler-Ids 的数量就会增加。这种情况发生得非常迅速,并且在很短的时间内变得非常多(11kB及以上的数据)。

缺少cookie是否会使Mvc-Mini-Profiler以这种方式工作,或者我的实现可能出现任何问题?

2 个答案:

答案 0 :(得分:6)

这是我认为的设计。虽然我们可以稍微改进实现。

X-MiniProfiler-Ids需要“消耗”,它们仅在启用性能分析时显示。它以这种方式工作的原因是您可以分析POST并重定向。

我们可能应该在那里设置一些明确的上限(比如20左右) - 请为此发布一个错误。

但是,由于您从未真正计划为您的HTTP客户端使用任何性能分析块,我建议放弃性能分析如果,则useragent是您的HTTP客户端。

您可以通过在之前添加条件来完成此操作:

// don't run if UserAgent is "my http client"
if(notMyUserAgent)
   MvcMiniProfiler.MiniProfiler.Start();  

答案 1 :(得分:1)

另一个选项是覆盖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;
    }
}