I'm using mini profiler in my asp.net Web API project and want to track the performance of some code that runs in a custom DelegatingHandler.
The calls MiniProfiler.Current.Step()
inside the DelegatingHandler
don't show up in the results. Other calls in the same project show up ok.
Further investigation revealed that MiniProfiler.Current
is retrieved from HttpContext.Current
in the WebRequestProfilerProvider
. And HttpContext.Current
is null when called from DelegatingHandler
.
Is there a better way to retrieve the MiniProfiler.Current so that it works inside the handler?
MiniProfiler Timings are stored in HttpContext.Current
by default (as you discovered). Thus if you are calling MiniProfiler from a place where HttpContxt.Current
is null, the results cannot be saved. The solution is to save (and retrieve) the results from somewhere else.
MiniProfiler offers the option of the option of changing the location where all results should be stored and retrieved from (using MiniProfiler.Settings.Storage
). The new v3 MiniProfiler (beta nuget here) offers the option of configuring different IStorage
for each request, and for using a MultiStorageProvider
to designate multiple locations into which results can be stored and retrieved. You can see an example of this in the Sample.Mvc project on github.
In your case, the best approach might be to set a MultiStorageProvider
for your global MiniProfiler.Settings.Storage
that will first save/retrieve from HttpRuntimeCacheStorage
and then afterwards will use some other IStorage
that is accessible from the DelegatingHandler
. Then in the DelegatingHandler
, set the MiniProfiler.Current.Storage
to only use the second storage option that you set in the MultiStorageProvider
(since it is pointless to try to save the the HttpCache). In this was, profiles from the DelegatingHandler
will be saved into your second storage option, and will be retrieved for view with your other results (since MultiStorageProvider
will Load
results from the first place it can get them - if it doesn't find the result in HttpCache, it will go to the second option.
Note - having multiple storage options is useful in this case, but it can have a negative impact on the performance of retrieving profiles.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With