Tipps und Tricks rund um .NET und Visual Studio

Tracing in ASP.NET Web API
Kommentare

Dr. Holger Schwichtenberg (MVP) und FH-Prof. Manfred Steyer teilen in der Kolumne „.NETversum“ ihr Expertenwissen rund um .NET-Tools und WPF mit.

Um Informationen über die von ASP.NET Web API durchgeführten Aktionen zu erhalten, kann der Entwickler auf einen anpassbaren Tracing-Mechanismus zurückgreifen. Dieser Mechanismus, der vor allem (aber nicht nur) im Zuge der Diagnose von Problemen hilfreich sein kann, sieht vor, dass der Entwickler eine Klasse bei ASP.NET Web API registriert, die das Interface ITraceWriter implementiert. Dieser TraceWriter hat die Aufgabe, die von Web API protokollierten Informationen entgegenzunehmen, ggf. zu filtern und zu speichern.

Tracing-Mechanismus und ASP.NET Web API

Microsoft bietet eine TraceWriter-Implementierung an, die unter Verwendung der Tracing-Infrastruktur von .NET, die über den Namensraum System.Diagnostics angeboten wird, Daten protokolliert. Der Entwickler kann diese über das NuGet-Package microsoft.aspnet.webapi.tracing beziehen. Dieses Paket wird beim Einsatz der ASP.NET und Web Tools 2012.2 automatisch eingebunden, wenn man ein Projekt mit der Vorlage ASP.NET MVC 4 erstellt und anschließend angibt, ein Web-API-Projekt erstellen zu wollen.

Um diesen TraceWriter zu registrieren, ist innerhalb der Methode Register, die sich in der Klasse WebApiConfig im Ordner App_Start befindet und von der Methode Application_Start in der Datei global.asax zur Ausführung gebracht wird, die Erweiterungsmethode EnableSystemDiagnosticsTracing aufzurufen:

config.EnableSystemDiagnosticsTracing();

Standardmäßig findet der Entwickler die von diesem TraceWriter protokollierten Daten im Output-Fenster von Visual Studio. Mit den Mechanismen von .NET kann er diese Daten jedoch an andere Ziele, zum Beispiel an Protokolldateien, weiterleiten.

Um einen eigenen TraceWriter bereitzustellen, implementiert der Entwickler das Interface ITraceWriter (Listing 1) sowie dessen Methode Trace, an welche das ASP.NET Web API Ablaufinformationen übergibt. Im betrachteten Beispiel werden die erhaltenen Informationen lediglich mit File.AppendAllText an eine Protokolldatei angehängt. Alternativ dazu könnte der Entwickler an dieser Stelle die Daten in einer Datenbank ablegen bzw. an das Logging-Framework der Wahl delegieren.

Interessant ist auch die Tatsache, dass zunächst nur die wichtigsten Daten der zu protokollierenden Nachricht zur Verfügung stehen. Dabei handelt es sich um die aktuelle HttpRequestMessage, eine Nachrichtenkategorie sowie ein Level, das die Art der Nachricht (Debug, Info, Warn, Error, Fatal) anzeigt. Aufgrund dieser Daten kann die Implementierung entscheiden, ob weitere Details der Nachricht ermittelt werden sollen. Falls dem so ist, erzeugt sie – wie in der betrachteten Implementierung gezeigt – mit den genannten Daten einen TraceRecord und übergibt diesen an die übergebene Action. Diese hat die Aufgabe, den TraceRecord mit Details zu füllen. Dadurch, dass diese Aufgabe von einer Action wahrgenommen wird, muss das Ermitteln von Details nur dann durchgeführt werden, wenn die Nachricht auch wirklich protokolliert werden soll. In allen anderen Fällen wird auf diese Aufgabe zugunsten der Performance verzichtet.

public class CustomTraceWriter : ITraceWriter
{
  public void Trace(HttpRequestMessage request, string category, 
    System.Web.Http.Tracing.TraceLevel level, Action traceAction)
  {
    TraceRecord record = new TraceRecord(request, category, level);
    traceAction(record);
    File.AppendAllText(
      "log.txt", 
      category + ": " + level + " " + record.Message);
  }
}

Um den benutzerdefinierten TraceWriter zu registrieren, verwendet der Entwickler das nachfolgende Schnipsel, das er zum Beispiel in der Methode WebAPIConfig.Register platziert:

config.Services.Replace(typeof(ITraceWriter), new SimpleTracer());

Der auf diese Weise registrierte TraceWriter kann auch von den einzelnen Action-Methoden verwendet werden. Der folgende Schnipsel zeigt, wie dies bewerkstelligt werden kann:

Configuration.Services.GetTraceWriter().Info(Request, "Kategorie123", "Hallo Welt!");
Unsere Redaktion empfiehlt:

Relevante Beiträge

Meinungen zu diesem Beitrag

X
- Gib Deinen Standort ein -
- or -