5

私は Mvc-Mini-Profiler を使用しています (素晴らしい製品です!)。通常の Web ブラウザーを使用すると、すべて正常に動作するように見えますが、独自の HTTP クライアント (Cookie をサポートしない基本的な http 1.1) を使用するとすぐに、http ヘッダーのX-MiniProfiler-Idsの量が増加します。これは非常に急速に発生し、短時間で非常に多くなります (11kB 以上のデータ)。

Cookie がないと、Mvc-Mini-Profiler がこのように動作する可能性がありますか? または、実装に何か問題がある可能性がありますか?

4

2 に答える 2

6

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

X-MiniProfiler-Ids消費」する必要があるため、プロファイリングが有効になっている場合にのみ表示されます。このように機能する理由は、プロファイリングPOSTとリダイレクトができるようにするためです。

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

ただし、HTTP クライアントのプロファイリング ブロックを実際に使用する予定はないため、ユーザー エージェントが HTTP クライアントである場合は、プロファイリングを放棄することをお勧めします。

これを行うには、前に条件を追加します。

// don't run if UserAgent is "my http client"
if(notMyUserAgent)
   MvcMiniProfiler.MiniProfiler.Start();  
于 2011-08-28T00:43:52.497 に答える
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;
    }
}
于 2011-10-27T06:22:03.617 に答える