Asp.net web api 带有Web.API 2的MiniProfiler;是否存在全局magic请求上下文对象?

Asp.net web api 带有Web.API 2的MiniProfiler;是否存在全局magic请求上下文对象?,asp.net-web-api,httpcontext,action-filter,mvc-mini-profiler,Asp.net Web Api,Httpcontext,Action Filter,Mvc Mini Profiler,我正试图在我的web api站点上安装MiniProfiler,但很难让MiniProfiler.Current正常工作 我在miniprofiler.com上遵循了说明,并在global.asax中提供了以下内容: 受保护的无效应用程序\u Start() { MiniProfilerEF6.Initialize(); //其他设置 } 受保护的无效应用程序_BeginRequest(){ //需要在这里启动一个以呈现UI MiniProfiler.Start(); } 受保护的无效应用程序\

我正试图在我的web api站点上安装MiniProfiler,但很难让
MiniProfiler.Current
正常工作

我在miniprofiler.com上遵循了说明,并在global.asax中提供了以下内容:

受保护的无效应用程序\u Start()
{
MiniProfilerEF6.Initialize();
//其他设置
}
受保护的无效应用程序_BeginRequest(){
//需要在这里启动一个以呈现UI
MiniProfiler.Start();
}
受保护的无效应用程序\u EndRequest(){
MiniProfiler.Stop();
}
这使用默认值,它将实际概要文件对象存储在
HttpContext.Current.Items

当我询问
MiniProfiler.Current
时,它会查看
HttpContext.Current

当我请求一个web api URL时:

  • Application\u BeginRequest
    创建探查器,将其存储在
    HttpContext.Current
  • 在web api
    MessageHandler
    中,我可以看到
    HttpContext.Current
  • 在web apu
    IActionFilter
    中,
    HttpContext.Current
    现在为空,我尝试
    MiniProfiler.Current.Step(“控制器:操作”)
    失败
  • 从各种服务运行的我的EF查询不会被记录,因为miniprofiler钩子依赖于
    miniprofiler.Current
    ,它依赖于
    HttpContext.Current
    ,该钩子现在为空
  • Application\u EndRequest
    激发,然后
    HttpContext.Current
    神奇地返回,因此它包装了探查器,并告诉我从请求开始到现在有多长时间了
我深入研究了代码,可以创建自己的
IProfileProvider
,将探查器对象存储在比
HttpContext.Current
更可靠的地方,但我不知道它可能在哪里

我花了几个小时试了试,但找不到可行的解决办法。问题是:

  • IProfileProvider
    是一个全局变量;MVC或Web API管道中的所有工作线程都必须使用相同的
    IProfileProvider
  • 我可以在web api RequestContext.Properties中搜索,以提取该请求的HttpContext,但这并没有真正的帮助,因为我的
    IProfileProvider
    在整个应用程序中都是全局的;如果我告诉它将概要文件存储在HttpContext A中,那么对其他HttpContext的任何同时请求都会污染概要文件
  • 我不能依赖任何类型的线程存储,因为异步/等待动态地重用线程
  • 我无法将探查器对象与
    InRequestScope
    绑定在Ninject中,因为
    InRequestScope
    似乎不适用于web api 2.1,但即使我可以
  • 每个人都说
    HttpRequestMessage.Properties
    是新的
    HttpContext.Current.Items
    ,但同样,
    IProfileProvider
    是一个全局变量,我不知道如何确保每个请求都查看其版本
    HttpRequestMessage
    MiniProfiler.Current
    可以从任何地方调用,因此我猜全局
    IProfileProvider
    必须以某种方式检查调用堆栈,并在那里找到
    HttpRequestMessage
    ?听起来像是疯了

我不知所措。我真正想要的是一个。

把问题组合在一起的过程中,我找到了答案<代码>HttpContext.Current在异步/等待时可能会丢失:

我必须对其中列出的web.config进行更改,并在任何
等待
之前,将过滤器调整为使用
Miniprofiler.Current

还讨论了