2011-08-25 19 views
5

Estoy usando Mvc-Mini-Profiler (¡qué gran producto!). Usando mi navegador web ordinario todo parece funcionar bien, pero tan pronto como uso mi propio cliente http (http básico 1.1 sin soporte de cookies) la cantidad de X-MiniProfiler-Ids en el encabezado http aumenta. Esto ocurre con bastante rapidez y se convierte en bastante en un corto período de tiempo (11kB y más de datos).Mvc-Mini-Profiler: ¿Por qué tantos X-MiniProfiler-Ids?

¿Puede la falta de cookies hacer que Mvc-Mini-Profiler funcione de esta manera o podría haber algún problema con mi implementación?

Respuesta

6

Esto es por diseño, creo. Aunque podríamos mejorar la implementación un poco.

El X-MiniProfiler-Ids necesita ser "consumido", solo aparecen cuando se habilita el perfil. La razón por la que funciona de esta manera es para que pueda crear el perfil POST y redirigir.

Probablemente deberíamos establecer un límite superior claro allí (como 20 o más) - por favor, publique un error para eso.

Sin embargo, como nunca planea consumir ningún bloque de creación de perfiles para su cliente HTTP, recomendaría abandonar el perfil si el agente de servicio es su cliente HTTP.

Usted puede hacer esto mediante la adición de un condicional antes:

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

Gracias, error reportado como [# 99] (http://code.google.com/p/mvc-mini-profiler/issues/detail?id=99) –

1

Otra opción es sustituir la clase de SqlServerStorage y por defecto el campo UserHasViewed true. Esto mantendrá la cadena X-MiniProfiler-Id al mínimo.

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

solución inteligente, pero esto requiere usar un almacenamiento sql? Además, esto evita que los agentes de usuario que pueden manejar una gran cantidad de identificadores x-mini-profiler operen "normalmente". –

+0

Este enfoque podría usarse para anular MemoryStorage también. Acabo de publicar este código de mi proyecto. Sin embargo, almacenar los datos en una base de datos tiene sus ventajas [MVC Mini Profiler Dashboard] (http://code.google.com/p/mvc-mini-profiler-dashboard/). –

+0

Para responder a su segunda pregunta: Sí, evitaría la funcionalidad normal en los clientes que pueden manejar la gran cantidad de identificadores x-mini-profiler-id. Su otra opción sería pasar el Mvc-mini-profiler y corregir el código original o eliminar los encabezados x-mini-profiler-id para clientes que no pueden admitirlos :( –

Cuestiones relacionadas