我试图在我的网站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
MessageHandler
中,我可以看到HttpContext.Current
IActionFilter
中的HttpContext.Current
现在为空,我对MiniProfiler.Current.Step("controller:action")
的尝试失败MiniProfiler.Current
,它依赖于HttpContext.Current
,现在为null Application_EndRequest
大火,HttpContext.Current
神奇地回来了,所以它包裹了探查器并告诉我自请求开始以来已经过了多长时间我挖掘了代码,我可以创建自己的IProfileProvider
,将探查器对象存储在比HttpContext.Current
更可靠的地方,但我不知道它可能在哪里。< / p>
我花了几个小时尝试,但无法找到可行的解决方案。问题:
IProfileProvider
是一个全局变量; MVC或Web API管道中的所有工作线程都必须使用相同的IProfileProvider
IProfileProvider
在整个应用程序中是全局的;如果我告诉它将配置文件存储在HttpContext A中,那么对其他HttpContexts的任何同时请求都将污染配置文件InRequestScope
绑定在Ninject绑定中,因为InRequestScope
似乎无法使用web api 2.1,但即使我可以HttpRequestMessage.Properties
是新HttpContext.Current.Items
,但同样,IProfileProvider
是一个全局变量,我不知道如何确保每个请求都在查看他们的版本HttpRequestMessage
。可以从任何地方调用MiniProfiler.Current
,所以我想全局IProfileProvider
必须以某种方式检查调用堆栈并在那里找到HttpRequestMessage
?这听起来像是疯了。我不知所措。我真正想要的是special variable。
答案 0 :(得分:2)
将问题放在一起的过程我弄清楚了。异步/等待事物时,HttpContext.Current
可能会丢失:Why is HttpContext.Current null after await?
我必须在其中列出web.config更改,并在任何Miniprofiler.Current
之前调整我的过滤器以使用await
。