Asp.net web api 从System.Net.Http.DelegatingHandler调用MiniProfiler.Current时为null

Asp.net web api 从System.Net.Http.DelegatingHandler调用MiniProfiler.Current时为null,asp.net-web-api,mvc-mini-profiler,Asp.net Web Api,Mvc Mini Profiler,我正在asp.net Web API项目中使用mini profiler,希望跟踪在自定义DelegatingHandler中运行的某些代码的性能 DelegatingHandler中的调用MiniProfiler.Current.Step()。同一项目中的其他调用显示为ok 进一步调查显示,MiniProfiler.Current是从WebRequestProfilerProvider中的HttpContext.Current检索的。和HttpContext.Current在从Delegati

我正在asp.net Web API项目中使用mini profiler,希望跟踪在自定义DelegatingHandler中运行的某些代码的性能

DelegatingHandler
中的调用
MiniProfiler.Current.Step()。同一项目中的其他调用显示为ok

进一步调查显示,
MiniProfiler.Current
是从
WebRequestProfilerProvider
中的
HttpContext.Current
检索的。和
HttpContext.Current
在从
DelegatingHandler
调用时为空


是否有更好的方法检索MiniProfiler.Current以便它在处理程序中工作?

默认情况下,MiniProfiler计时存储在
HttpContext.Current
中(如您所发现的)。因此,如果从
HttpContxt.Current
为空的位置调用MiniProfiler,则无法保存结果。解决方案是从其他地方保存(并检索)结果

MiniProfiler提供了更改所有结果存储和检索位置的选项(使用
MiniProfiler.Settings.Storage
)。()提供了为每个请求配置不同的
IStorage
的选项,以及使用
MultiStorageProvider
指定可存储和检索结果的多个位置的选项。您可以在github上的项目中看到这方面的一个示例

在您的情况下,最好的方法可能是为您的全局
MiniProfiler.Settings.Storage
设置一个
MultiStorageProvider
,它将首先从
HttpRuntimeCacheStorage
保存/检索,然后使用从
DelegatingHandler
访问的其他
IStorage
。然后在
DelegatingHandler
中,将
MiniProfiler.Current.Storage
设置为仅使用在
MultiStorageProvider
中设置的第二个存储选项(因为尝试保存HttpCache是毫无意义的)。在这个was中,
DelegatingHandler
中的配置文件将被保存到您的第二个存储选项中,并将与其他结果一起检索以供查看(因为
MultiStorageProvider
将从它能够获取它们的第一个位置获取结果-如果它在HttpCache中找不到结果,它将转到第二个选项


注意-在这种情况下,具有多个存储选项很有用,但可能会对检索配置文件的性能产生负面影响。

这可能回答了您的问题?[MvcMiniProfiler是否需要web应用程序才能工作,或者是否可以在纯库中使用,例如在单元测试中使用?][1][1]: