2013-07-05 12 views
9

Sto usando il mini profiler nel mio progetto API Web asp.net e voglio tenere traccia delle prestazioni di un codice che viene eseguito in un DelegatingHandler personalizzato.MiniProfiler.Current è nullo quando chiamato da System.Net.Http.DelegatingHandler

Le chiamate MiniProfiler.Current.Step() all'interno dello DelegatingHandler non vengono visualizzate nei risultati. Altre chiamate nello stesso progetto appaiono ok.

Ulteriori indagini hanno rivelato che MiniProfiler.Current viene recuperato da HttpContext.Current nello WebRequestProfilerProvider. E HttpContext.Current è nullo quando chiamato da DelegatingHandler.

C'è un modo migliore per recuperare il MiniProfiler.Current in modo che funzioni all'interno del gestore?

+1

Forse questo risponde alla tua domanda.? [MvcMiniProfiler richiede un'applicazione Web per funzionare o può essere utilizzata in librerie pure, ad esempio nei test di unità?] [1] [1]: http://stackoverflow.com/questions/8526609/does-mvcminiprofiler-require-a-web-application-to-work-or-can-it-be-used-in- pur –

risposta

3

Le temporizzazioni MiniProfiler sono memorizzate in HttpContext.Current per impostazione predefinita (come è stato rilevato). Quindi se stai chiamando MiniProfiler da un posto dove HttpContxt.Current è nullo, i risultati non possono essere salvati. La soluzione è salvare (e recuperare) i risultati da qualche altra parte.

MiniProfiler offre la possibilità di modificare la posizione in cui tutti i risultati devono essere memorizzati e recuperati da (utilizzando MiniProfiler.Settings.Storage). Il new v3 MiniProfiler (beta nuget here) offre la possibilità di configurare diversi IStorage per ogni richiesta e di utilizzare uno MultiStorageProvider per designare più posizioni in cui i risultati possono essere memorizzati e recuperati. Puoi vedere un esempio di questo nel progetto Sample.Mvc su github.

Nel tuo caso, l'approccio migliore potrebbe essere quella di impostare un MultiStorageProvider per il vostro globale MiniProfiler.Settings.Storage che prima salvare/recuperare dal HttpRuntimeCacheStorage e poi dopo utilizzerà qualche altro IStorage che è accessibile dalla DelegatingHandler. Quindi nello DelegatingHandler, impostare MiniProfiler.Current.Storage per utilizzare solo la seconda opzione di archiviazione impostata su MultiStorageProvider (poiché è inutile cercare di salvare HttpCache). In questo modo, i profili da DelegatingHandler verranno salvati nella seconda opzione di archiviazione e verranno recuperati per la visualizzazione con altri risultati (dal momento che MultiStorageProvider corrisponderà ai risultati Load dal primo luogo in cui li può ottenere, se non trova il risultato in HttpCache, si andrà alla seconda opzione

Nota -. avere più opzioni di storage è utile in questo caso, ma può avere un impatto negativo sulle prestazioni dei profili di recupero dei

Problemi correlati