2011-08-25 18 views
5

私はMvc-Mini-Profilerを使用しています(これは素晴らしい製品です)。私の普通のWebブラウザを使用するとすべてうまくいくように見えますが、自分のhttpクライアント(Cookieをサポートしていない基本的なhttp 1.1)を使用するとすぐに、httpヘッダー内のX-MiniProfiler-Idの量が増えます。これはかなり急速に起こり、短い時間(11kB以上のデータ)で非常に多くなります。Mvc-Mini-Profiler:なぜそんなに多くのX-MiniProfiler-Idがありますか?

クッキーがないとMvc-Mini-Profilerがこのように動作するか、実装に間違いがありますか?

答えて

6

これは設計によるものだと思います。実装を少し改善することができました。

X-MiniProfiler-Idsは、「消費する」必要があります。プロファイリングが有効な場合にのみ表示されます。このように動作する理由は、POSTをプロファイルしてリダイレクトできることです。

おそらく(20程度のような)明確な上限を設定する必要があります。そのためのバグを投稿してください。

しかし、実際にHTTPクライアントのプロファイリングブロックを使用する予定はないので、 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クラスをオーバーライドし、trueに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 Dashboard](http://code.google.com/p/mvc-mini-profiler-dashboard/) –

+0

2つ目の質問に答えるには:はい、多数のx-mini-profiler-idを処理できるクライアントでは通常の機能が妨げられます。あなたの他のオプションは、Mvc-mini-profilerをフォークし、元のコードに修正したり、サポートしていないクライアントのx-mini-profiler-idヘッダーを削除したりすることです。 –

関連する問題