我在我的 asp.net Web API 项目中使用迷你分析器,并希望跟踪在自定义 DelegatingHandler 中运行的某些代码的性能。
电话MiniProfiler.Current.Step()
内DelegatingHandler
不要出现在结果中。同一项目中的其他调用显示正常。
进一步调查发现MiniProfiler.Current
检索自 HttpContext.Current
在 WebRequestProfilerProvider
.和 HttpContext.Current
从 DelegatingHandler
调用时为空.
有没有更好的方法来检索 MiniProfiler.Current 以便它在处理程序中工作?
最佳答案
MiniProfiler 时间存储在 HttpContext.Current
默认情况下(如您所见)。因此,如果您从 HttpContxt.Current
的地方调用 MiniProfiler为空,结果无法保存。解决方案是从其他地方保存(和检索)结果。
MiniProfiler 提供了更改所有结果存储和检索位置的选项(使用 MiniProfiler.Settings.Storage
)。 new v3 MiniProfiler ( beta nuget here ) 提供了配置不同的选项 IStorage
对于每个请求,以及使用 MultiStorageProvider
指定可以存储和检索结果的多个位置。您可以在 Sample.Mvc 中看到这样的示例。 github 上的项目。
在您的情况下,最好的方法可能是设置 MultiStorageProvider
为您的全局MiniProfiler.Settings.Storage
这将首先从 HttpRuntimeCacheStorage
保存/检索然后之后将使用其他一些 IStorage
可从 DelegatingHandler
访问.然后在 DelegatingHandler
,设置 MiniProfiler.Current.Storage
仅使用您在 MultiStorageProvider
中设置的第二个存储选项(因为尝试保存 HttpCache 是没有意义的)。在这里,来自 DelegatingHandler
的配置文件将被保存到您的第二个存储选项中,并将被检索以查看您的其他结果(因为 MultiStorageProvider
将 Load
从它可以获得的第一个结果开始 - 如果它在 HttpCache 中找不到结果,它将转到第二个选项。
注意 - 在这种情况下,具有多个存储选项很有用,但它可能会对检索配置文件的性能产生负面影响。
关于asp.net-web-api - 从 System.Net.Http.DelegatingHandler 调用时 MiniProfiler.Current 为 null,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17488355/