2011-08-25 114 views
5

我正在使用Mvc-Mini-Profiler(多么棒的产品!)。使用我的普通网络浏览器似乎一切正常,但只要我使用我自己的http客户端(基本http 1.1而不支持cookie),http头中的X-MiniProfiler-IDds的数量就会增加。这发生得非常快,在很短的时间内(11kB及以上的数据)就变得非常多。Mvc-Mini-Profiler:为什么这么多X-MiniProfiler-ID?

Cookie的缺乏是否会使Mvc-Mini-Profiler以这种方式工作,或者在我的实施中可能会出错?

回答

6

这是我设计的想法。尽管我们可以稍微改进一下。

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

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

但是,由于您从未真正打算为您的HTTP客户端使用任何分析块,因此我建议放弃分析如果 useragent是您的HTTP客户端。

您可以通过之前增加一个条件做到这一点:

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

谢谢,错误报告为[#99](http://code.google.com/p/mvc-mini-profiler/issues/detail?id=99) –

1

另一种选择是覆盖SqlServerStorage类和UserHasViewed场默认为真。这将使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; 
    } 
} 
+0

巧妙的解决,但这需要我使用SQL存储?此外,这可以防止可以处理大量x-mini-profiler-id的用户代理“正常”运行。 –

+0

这种方法也可以用来重写MemoryStorage,我只是碰巧从我的项目中发布了这些代码。但是,将数据存储在数据库中确实有其优势[MVC Mini Profiler仪表板](http://code.google.com/p/mvc-mini-profiler-dashboard/)。 –

+0

要回答你的第二个问题:是的,它会阻止可以处理大量x-mini-profiler-id的客户端的正常功能。你的另一个选择是分叉Mvc-mini-profiler,并修复原始代码或为不支持它们的客户端删除x-mini-profiler-id头:( –