MiniProfiler与Web.API 2;是否有全局魔术请求上下文对象?

时间:2014-04-24 03:23:09

标签: asp.net-web-api httpcontext action-filter mvc-mini-profiler

我试图在我的网站API网站上设置MiniProfiler,并且很难让MiniProfiler.Current工作。

我按照miniprofiler.com上的说明操作,并在global.asax中有以下内容:

protected void Application_Start()
{
  MiniProfilerEF6.Initialize();
  // other setup
}
protected void Application_BeginRequest() {
  // need to start one here in order to render out the UI
  MiniProfiler.Start();
}
protected void Application_EndRequest() {
  MiniProfiler.Stop();
}

这使用默认的WebRequestProfilerProvider,它将实际的个人资料对象存储在HttpContext.Current.Items中。

当我要求MiniProfiler.Current时,它会查看HttpContext.Current

当我向我的某个网络API网址发出请求时:

  • Application_BeginRequest创建了探查器,将其存储在HttpContext.Current
  • 在网络API MessageHandler中,我可以看到HttpContext.Current
  • 网络apu IActionFilter中的
  • HttpContext.Current现在为空,我对MiniProfiler.Current.Step("controller:action")的尝试失败
  • 我从各种服务运行的EF查询都没有被记录,因为miniprofiler hook依赖于MiniProfiler.Current,它依赖于HttpContext.Current,现在为null
  • Application_EndRequest大火,HttpContext.Current神奇地回来了,所以它包裹了探查器并告诉我自请求开始以来已经过了多长时间

我挖掘了代码,我可以创建自己的IProfileProvider,将探查器对象存储在比HttpContext.Current更可靠的地方,但我不知道它可能在哪里。< / p>

我花了几个小时尝试,但无法找到可行的解决方案。问题:

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

我不知所措。我真正想要的是special variable

1 个答案:

答案 0 :(得分:2)

将问题放在一起的过程我弄清楚了。异步/等待事物时,HttpContext.Current可能会丢失:Why is HttpContext.Current null after await?

我必须在其中列出web.config更改,并在任何Miniprofiler.Current之前调整我的过滤器以使用await

还在http://trycatchfail.com/blog/post/Using-HttpContext-Safely-After-Async-in-ASPNET-MVC-Applications.aspx

进行了讨论