我正在使用Mvc-Mini-Profiler(这是一个很棒的产品!)。使用我的普通网络浏览器似乎一切正常,但只要我使用自己的http客户端(没有cookie支持的基本http 1.1),http标头中 X-MiniProfiler-Ids 的数量就会增加。这种情况发生得非常迅速,并且在很短的时间内变得非常多(11kB及以上的数据)。
缺少cookie是否会使Mvc-Mini-Profiler以这种方式工作,或者我的实现可能出现任何问题?
答案 0 :(得分:6)
这是我认为的设计。虽然我们可以稍微改进实现。
X-MiniProfiler-Ids
需要“消耗”,它们仅在启用性能分析时显示。它以这种方式工作的原因是您可以分析POST
并重定向。
我们可能应该在那里设置一些明确的上限(比如20左右) - 请为此发布一个错误。
但是,由于您从未真正计划为您的HTTP客户端使用任何性能分析块,我建议放弃性能分析如果,则useragent是您的HTTP客户端。
您可以通过在之前添加条件来完成此操作:
// don't run if UserAgent is "my http client"
if(notMyUserAgent)
MvcMiniProfiler.MiniProfiler.Start();
答案 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;
}
}