2013-07-05 15 views
9

Używam mini profilera w moim asp.net Web API projektu i chcę śledzić wydajność niektórych kodu, który działa w niestandardowym DelegatingHandler.MiniProfiler.Current ma wartość null, gdy jest wywoływana z System.Net.Http.DelegatingHandler

Połączenia MiniProfiler.Current.Step() wewnątrz DelegatingHandler nie pojawiają się w wynikach. Inne połączenia w tym samym projekcie są wyświetlane poprawnie.

Dalsze dochodzenie ujawniło, że MiniProfiler.Current jest pobierane z HttpContext.Current w WebRequestProfilerProvider. I HttpContext.Current ma wartość null, gdy jest wywoływana z DelegatingHandler.

Czy istnieje lepszy sposób na odzyskanie programu MiniProfiler.Current, aby działał wewnątrz programu obsługi?

+1

może to jest odpowiedź na Twoje pytanie.? [Czy aplikacja MvcMiniProfiler wymaga działania aplikacji sieciowej, czy może być używana w czystych bibliotekach, np. W testach jednostkowych?] [1] [1]: http://stackoverflow.com/questions/8526609/does-mvcminiprofiler-require-a-web-application-to-work-or-can-it-be-used-in- pur –

Odpowiedz

3

Czas działania MiniProfiler jest domyślnie przechowywany w HttpContext.Current (jak odkryłeś). Tak więc jeśli wywołujesz MiniProfiler z miejsca, w którym HttpContxt.Current ma wartość NULL, wyników nie można zapisać. Rozwiązaniem jest zapisywanie (i pobieranie) wyników z innych źródeł.

MiniProfiler oferuje opcję zmiany lokalizacji, w której wszystkie wyniki powinny być przechowywane i pobierane (za pomocą MiniProfiler.Settings.Storage). Model new v3 MiniProfiler (beta nuget here) oferuje opcję konfiguracji różnych IStorage dla każdego żądania i używania MultiStorageProvider do wyznaczania wielu lokalizacji, w których wyniki mogą być przechowywane i pobierane. Możesz zobaczyć przykład tego w projekcie Sample.Mvc na github.

W twoim przypadku, najlepszym rozwiązaniem może być ustawienie MultiStorageProvider dla globalnego MiniProfiler.Settings.Storage że najpierw zapisać/odzyskać od HttpRuntimeCacheStorage a następnie potem użyje innego IStorage, który jest dostępny z DelegatingHandler. Następnie w DelegatingHandler ustaw MiniProfiler.Current.Storage, aby używał tylko drugiej opcji przechowywania ustawionej w MultiStorageProvider (ponieważ nie ma sensu próba zapisania HttpCache). W tym przypadku profile z DelegatingHandler zostaną zapisane w drugiej opcji przechowywania i zostaną pobrane do wyświetlenia wraz z innymi wynikami (od MultiStorageProvider uzyska Load wyników od pierwszego miejsca, w którym może je uzyskać - jeśli nie znajdzie wyniku w HttpCache, przejdzie do drugiej opcji

Uwaga. - mając wiele opcji pamięci masowej jest przydatne w tym przypadku, ale może to mieć negatywny wpływ na wydajność profili przywoływania

Powiązane problemy