2013-07-05 6 views
9
aufgerufen wird

Ich verwende Mini-Profiler in meinem asp.net-Web-API-Projekt und möchte die Leistung von Code, der in einem benutzerdefinierten DelegatingHandler ausgeführt wird, verfolgen.MiniProfiler.Current ist null, wenn von System.Net.Http.DelegatingHandler

Die Anrufe MiniProfiler.Current.Step() innerhalb der erscheinen nicht in den Ergebnissen. 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, den MiniProfiler.Current abzurufen, so dass er innerhalb des Handlers funktioniert?

+1

Vielleicht beantwortet Ihre Frage.? [Benötigt MvcMiniProfiler eine Webanwendung, um zu funktionieren, oder kann sie in reinen Bibliotheken verwendet werden, z. B. in Komponententests?] [1] [1]: http://stackoverflow.com/questions/8526609/does-mvcminiprofiler-require-a-web-application-to-work-or-can-it-be-used-in- rein –

Antwort

3

MiniProfiler Timings werden standardmäßig in HttpContext.Current gespeichert (wie Sie festgestellt haben). Wenn Sie also MiniProfiler von einem Ort aufrufen, an dem 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 Option, den Speicherort für alle Ergebnisse zu ändern (mit MiniProfiler.Settings.Storage). Die new v3 MiniProfiler (beta nuget here) bietet die Option, verschiedene IStorage für jede Anfrage zu konfigurieren und eine MultiStorageProvider zu verwenden, um mehrere Speicherorte anzugeben, in denen Ergebnisse gespeichert und abgerufen werden können. Sie können ein Beispiel dafür im Projekt Sample.Mvc auf github sehen.

In Ihrem Fall könnte der beste Ansatz ein MultiStorageProvider für Ihre globalen MiniProfiler.Settings.Storage einzustellen, die aus HttpRuntimeCacheStorage zuerst speichern/abrufen und dann wird danach ein anderes IStorage verwenden, das von den DelegatingHandler zugänglich ist. Setzen Sie dann in der DelegatingHandler die MiniProfiler.Current.Storage, um nur die zweite Speicheroption zu verwenden, die Sie in MultiStorageProvider festlegen (da es sinnlos ist, zu versuchen, den HttpCache zu speichern). In diesem Fall werden Profile aus der DelegatingHandler in Ihrer zweiten Speicheroption gespeichert und werden für die Anzeige mit Ihren anderen Ergebnissen abgerufen (seit MultiStorageProvider wird Load Ergebnisse von der ersten Stelle kann sie erhalten - wenn es nicht das Ergebnis finden in Httpcache, wird es in die zweite Option gehen

. Hinweis - mehrere Speicheroptionen mit in diesem Fall nützlich ist, aber es kann sich negativ auf die Leistung des Abrufens Profile haben

Verwandte Themen