2011-08-25 16 views
5

Używam Mvc-Mini-Profiler (co za świetny produkt!). Korzystanie z mojej zwykłej przeglądarki wydaje się działać dobrze, ale jak tylko użyję własnego klienta http (podstawowy http 1.1 bez obsługi plików cookie), liczba X-MiniProfiler-Ids w nagłówku http rośnie. Dzieje się to dość szybko i staje się dość liczne w krótkim czasie (11kB i więcej danych).Mvc-Mini-Profiler: Dlaczego tak wiele identyfikatorów X-MiniProfiler?

Czy brak plików cookie może spowodować, że program Mvc-Mini-Profiler działa w ten sposób, czy też może być coś nie tak z moją implementacją?

Odpowiedz

6

Jest to zgodne z projektem, jak sądzę. Chociaż możemy nieco poprawić implementację.

Należy "zużyć" X-MiniProfiler-Ids, pojawiają się one tylko po włączeniu profilowania. Powodem, dla którego działa w ten sposób, jest profil POST i przekierowania.

Prawdopodobnie powinniśmy ustawić tam pewien górny limit (np. 20 lub więcej) - proszę napisać o tym błąd.

Ponieważ jednak nigdy nie planujesz używać bloków profilowania dla klienta HTTP, polecam porzucić profilowanie , jeśli useragent jest twoim klientem HTTP.

Można to zrobić poprzez dodanie przed warunkowa:

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

Dzięki bug zgłoszony jako [# 99] (http://code.google.com/p/mvc-mini-profiler/issues/detail?id=99) –

1

Inną opcją jest, aby zastąpić klasę SqlServerStorage i domyślnie pole UserHasViewed true. Dzięki temu ciąg znaków X-MiniProfiler-Id zostanie zredukowany do minimum.

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

rozwiązania mądry, lecz wymagałoby to do korzystania z magazynu sql? Ponadto uniemożliwia to agentom użytkownika, którzy mogą obsłużyć dużą liczbę x-mini-profiler-ids, "normalnego" działania. –

+0

To podejście może być również użyte do zastąpienia MemoryStorage, po prostu zdałem ten kod z mojego projektu. Jednak przechowywanie danych w bazie danych ma swoje zalety [MVC Mini Profiler Dashboard] (http://code.google.com/p/mvc-mini-profiler-dashboard/). –

+0

Aby odpowiedzieć na drugie pytanie: Tak, uniemożliwi to normalną funkcjonalność dla klientów, którzy mogą obsłużyć dużą liczbę x-mini-profiler-ids. Inną opcją byłoby rozwidlenie mini-profilera Mvc i wykonanie poprawki do oryginalnego kodu lub usunięcie nagłówków x-mini-profiler-id dla klientów, którzy nie mogą ich obsługiwać :( –

Powiązane problemy