从System.Net.Http.DelegatingHandler调用时,MiniProfiler.Current为null

时间:2013-07-05 11:56:53

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

我在我的asp.net Web API项目中使用迷你探查器,并希望跟踪在自定义DelegatingHandler中运行的某些代码的性能。

MiniProfiler.Current.Step()内的来电DelegatingHandler不会显示在结果中。同一项目中的其他调用显示确定。

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

有没有更好的方法来检索MiniProfiler.Current以便它在处理程序中运行?

1 个答案:

答案 0 :(得分:3)

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

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

在您的情况下,最佳方法可能是为您的全局MultiStorageProvider设置MiniProfiler.Settings.Storage,该HttpRuntimeCacheStorage将首先从IStorage保存/检索,然后再使用其他DelegatingHandler可以从DelegatingHandler访问。然后在MiniProfiler.Current.Storage中,将MultiStorageProvider设置为仅使用您在DelegatingHandler中设置的第二个存储选项(因为尝试保存HttpCache是​​没有意义的)。在这种情况下,MultiStorageProvider中的个人资料将保存到您的第二个存储空间中,并将与其他结果一起检索以供查看(因为{{1}} Load会从第一位开始可以得到它们 - 如果它在HttpCache中找不到结果,它将转到第二个选项。

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