MiniProfiler.Current ist null, wenn er von System.Net.Http.DelegatingHandler aufgerufen wird

9

Ich verwende Mini-Profiler in meinem asp.net-Web-API-Projekt und möchte die Leistung von Code verfolgen, der in einem benutzerdefinierten DelegatingHandler ausgeführt wird.

Die Aufrufe MiniProfiler.Current.Step() in DelegatingHandler werden nicht in den Ergebnissen angezeigt. Andere Anrufe im selben Projekt erscheinen in Ordnung.

Weitere Untersuchungen ergaben, dass MiniProfiler.Current von HttpContext.Current in WebRequestProfilerProvider abgerufen wird. Und HttpContext.Current ist null, wenn von DelegatingHandler aufgerufen wird.

Gibt es eine bessere Möglichkeit, MiniProfiler.Current abzurufen, damit es im Handler funktioniert?

    
tozevv 05.07.2013, 11:56
quelle

1 Antwort

3

MiniProfiler Timings werden standardmäßig in HttpContext.Current gespeichert (wie Sie festgestellt haben). Wenn Sie MiniProfiler von einer Stelle aufrufen, an der HttpContxt.Current null ist, können die Ergebnisse nicht gespeichert werden. Die Lösung besteht darin, die Ergebnisse von woanders zu speichern (und abzurufen).

MiniProfiler bietet die Möglichkeit, den Speicherort für alle Ergebnisse zu ändern (mit MiniProfiler.Settings.Storage ). Der neue v3 MiniProfiler ( beta nugget hier ) bietet die Möglichkeit, für jede Anfrage verschiedene IStorage zu konfigurieren, und mit MultiStorageProvider mehrere Orte zu bestimmen, an denen die Ergebnisse liegen können gespeichert und abgerufen. Sie können ein Beispiel dafür in der Sample.Mvc sehen Projekt auf GitHub.

In Ihrem Fall könnte der beste Ansatz darin bestehen, ein MultiStorageProvider für Ihr globales MiniProfiler.Settings.Storage festzulegen, das zuerst von HttpRuntimeCacheStorage speichert / abruft und dann danach ein anderes IStorage verwendet, auf das von% zugegriffen werden kann. Code%. Setzen Sie in DelegatingHandler dann DelegatingHandler so, dass nur die zweite Speicheroption verwendet wird, die Sie in MiniProfiler.Current.Storage festgelegt haben (da es sinnlos ist, den HttpCache zu speichern). In diesem Fall werden Profile von MultiStorageProvider in Ihrer zweiten Speicheroption gespeichert und für die Anzeige mit Ihren anderen Ergebnissen abgerufen (da DelegatingHandler MultiStorageProvider ergibt sich aus dem ersten Platz, den es bekommen kann - wenn es das Ergebnis in HttpCache nicht findet , es wird zur zweiten Option gehen.

Hinweis: Mehrere Speicheroptionen sind in diesem Fall hilfreich, können sich jedoch negativ auf die Leistung beim Abrufen von Profilen auswirken.

    
Yaakov Ellis 15.02.2014, 21:12
quelle