我正在尝试在ActionFilter中编写一些日志代码来确定某些操作需要多长时间来处理。代码看起来像这样:
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
var stopwatch = new Stopwatch();
stopwatch.Start();
HttpContext.Current.Items.Add("Stopwatch", stopwatch);
}
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
var stopwatch = HttpContext.Current.Items["Stopwatch"] as Stopwatch;
if (stopwatch != null)
{
stopwatch.Stop();
var millis = stopwatch.ElapsedMilliseconds;
// Code to log here
}
}
此处在FilterConfig.cs
public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
filters.Add(new HandleErrorAttribute());
filters.Add(new LogRequestMetricFilter());
}
并在Autofac中配置属性注入:
builder.Register(c => new LogRequestMetricFilter()).PropertiesAutowired()
.AsActionFilterFor<Controller>().InstancePerRequest();
这大部分工作正常,但在某些情况下调用HttpContext.Current.Items.Add("Stopwatch", stopwatch);
时会抛出错误
项目已添加。键入字典:添加'秒表'键:'秒表'
这意味着请求之间共享HttpContext.Current
。这似乎发生在使用SignalR的方法上,但据我所知他们已经完成了这一点,并且它不应该共享HttpContext
。
任何人都可以解释为什么在项目词典中已经存在具有该键的项目时调用OnActionExecuting