Share via


Ablaufverfolgung in ASP.NET-Web-API 2

Wenn Sie versuchen, eine webbasierte Anwendung zu debuggen, gibt es keinen Ersatz für einen guten Satz von Ablaufverfolgungsprotokollen. In diesem Tutorial wird gezeigt, wie Sie die Ablaufverfolgung in ASP.NET-Web-API aktivieren. Sie können dieses Feature verwenden, um nachzuverfolgen, was das Web-API-Framework vor und nach dem Aufruf Ihres Controllers ausführt. Sie können es auch verwenden, um Ihren eigenen Code nachzuverfolgen.

Im Tutorial verwendete Softwareversionen

Aktivieren der System.Diagnostics-Ablaufverfolgung in der Web-API

Zunächst erstellen wir ein neues ASP.NET Webanwendungsprojekt. Wählen Sie in Visual Studio im Menü Datei die Option Neues>Projekt aus. Wählen Sie unter Vorlagen, Webdie Option ASP.NET Webanwendung aus.

Abbildung des Dialogfelds

Wählen Sie die Projektvorlage Web-API aus.

Bild von Web A P I ausgewählt

Wählen Sie im Menü Extrasdie Option NuGet-Paket-Manager und dann Paketverwaltungskonsole aus.

Geben Sie im Fenster Paket-Manager-Konsole die folgenden Befehle ein.

Install-Package Microsoft.AspNet.WebApi.Tracing
Update-Package Microsoft.AspNet.WebApi.WebHost

Mit dem ersten Befehl wird das neueste Web-API-Ablaufverfolgungspaket installiert. Außerdem werden die wichtigsten Web-API-Pakete aktualisiert. Mit dem zweiten Befehl wird das WebApi.WebHost-Paket auf die neueste Version aktualisiert.

Hinweis

Wenn Sie eine bestimmte Version der Web-API als Ziel verwenden möchten, verwenden Sie das Flag -Version, wenn Sie das Ablaufverfolgungspaket installieren.

Öffnen Sie die Datei WebApiConfig.cs im Ordner App_Start. Fügen Sie der Register-Methode den folgenden Code hinzu.

public static class WebApiConfig
{
    public static void Register(HttpConfiguration config)
    {
        // New code
        config.EnableSystemDiagnosticsTracing();

        // Other configuration code not shown.
    }
}

Dieser Code fügt der Web-API-Pipeline die SystemDiagnosticsTraceWriter-Klasse hinzu. Die SystemDiagnosticsTraceWriter-Klasse schreibt Ablaufverfolgungen in System.Diagnostics.Trace.

Um die Ablaufverfolgungen anzuzeigen, führen Sie die Anwendung im Debugger aus. Navigieren Sie im Browser zu /api/values.

Bild mit geänderter U R L

Die Ablaufverfolgungsanweisungen werden in das Ausgabefenster in Visual Studio geschrieben. (Wählen Sie im Menü Ansichtdie Option Ausgabe aus.

Abbildung der Ablaufverfolgungsanweisungen

Da SystemDiagnosticsTraceWriter Ablaufverfolgungen in System.Diagnostics.Trace schreibt, können Sie zusätzliche Ablaufverfolgungslistener registrieren. Beispielsweise, um Ablaufverfolgungen in eine Protokolldatei zu schreiben. Weitere Informationen zu Ablaufverfolgungsschreibern finden Sie im Thema Ablaufverfolgungslistener auf MSDN.

Konfigurieren von SystemDiagnosticsTraceWriter

Der folgende Code zeigt, wie Sie den Ablaufverfolgungsschreiber konfigurieren.

SystemDiagnosticsTraceWriter traceWriter = config.EnableSystemDiagnosticsTracing();
traceWriter.IsVerbose = true;
traceWriter.MinimumLevel = TraceLevel.Debug;

Es gibt zwei Einstellungen, die Sie steuern können:

  • IsVerbose: Wenn false, enthält jede Ablaufverfolgung minimale Informationen. Wenn true, enthalten Ablaufverfolgungen weitere Informationen.
  • MinimumLevel: Legt die minimale Ablaufverfolgungsebene fest. Ablaufverfolgungsebenen sind in der Reihenfolge Debug, Info, Warn, Error und Fatal.

Hinzufügen von Ablaufverfolgungen zu Ihrer Web-API-Anwendung

Durch das Hinzufügen eines Ablaufverfolgungsschreibers erhalten Sie sofortigen Zugriff auf die Ablaufverfolgungen, die von der Web-API-Pipeline erstellt wurden. Sie können auch den Ablaufverfolgungsschreiber verwenden, um Ihren eigenen Code nachzuverfolgen:

using System.Web.Http.Tracing;

public class ProductsController : ApiController
{
    public HttpResponseMessage GetAllProducts()
    {
        Configuration.Services.GetTraceWriter().Info(
            Request, "ProductsController", "Get the list of products.");

        // ...
    }
}

Rufen Sie httpConfiguration.Services.GetTraceWriter auf, um den Ablaufverfolgungsschreiber abzurufen. Von einem Controller aus kann über die ApiController.Configuration-Eigenschaft auf diese Methode zugegriffen werden.

Um eine Ablaufverfolgung zu schreiben, können Sie die ITraceWriter.Trace-Methode direkt aufrufen, aber die ITraceWriterExtensions-Klasse definiert einige Erweiterungsmethoden, die freundlicher sind. Die oben gezeigte Info-Methode erstellt beispielsweise eine Ablaufverfolgung mit Der Ablaufverfolgungsebene Info.

Web-API-Ablaufverfolgungsinfrastruktur

In diesem Abschnitt wird beschrieben, wie Sie einen benutzerdefinierten Ablaufverfolgungsschreiber für die Web-API schreiben.

Das Microsoft.AspNet.WebApi.Tracing-Paket basiert auf einer allgemeineren Ablaufverfolgungsinfrastruktur in der Web-API. Anstatt Microsoft.AspNet.WebApi.Tracing zu verwenden, können Sie auch eine andere Ablaufverfolgungs-/Protokollierungsbibliothek wie NLog oder log4net anschließen.

Implementieren Sie zum Sammeln von Ablaufverfolgungen die ITraceWriter-Schnittstelle . Hier sehen Sie ein einfaches Beispiel:

public class SimpleTracer : ITraceWriter
{
    public void Trace(HttpRequestMessage request, string category, TraceLevel level, 
        Action<TraceRecord> traceAction)
    {
        TraceRecord rec = new TraceRecord(request, category, level);
        traceAction(rec);
        WriteTrace(rec);
    }

    protected void WriteTrace(TraceRecord rec)
    {
        var message = string.Format("{0};{1};{2}", 
            rec.Operator, rec.Operation, rec.Message);
        System.Diagnostics.Trace.WriteLine(message, rec.Category);
    }
}

Die ITraceWriter.Trace-Methode erstellt eine Ablaufverfolgung. Der Aufrufer gibt eine Kategorie und Ablaufverfolgungsebene an. Die Kategorie kann eine beliebige benutzerdefinierte Zeichenfolge sein. Ihre Implementierung von Ablaufverfolgung sollte die folgenden Schritte ausführen:

  1. Erstellen Sie einen neuen TraceRecord.Create a new TraceRecord. Initialisieren Sie sie wie gezeigt mit der Anforderungs-, Kategorie- und Ablaufverfolgungsebene. Diese Werte werden vom Aufrufer bereitgestellt.
  2. Rufen Sie den TraceAction-Delegat auf. In diesem Delegat wird erwartet, dass der Aufrufer den Rest des TraceRecord-Werts ausfüllt.
  3. Schreiben Sie den TraceRecord mit einer beliebigen Protokollierungsmethode. Das hier gezeigte Beispiel ruft einfach System.Diagnostics.Trace auf.

Festlegen des Ablaufverfolgungsschreibers

Um die Ablaufverfolgung zu aktivieren, müssen Sie die Web-API für die Verwendung Ihrer ITraceWriter-Implementierung konfigurieren. Hierzu verwenden Sie das HttpConfiguration-Objekt , wie im folgenden Code gezeigt:

public static void Register(HttpConfiguration config)
{
    config.Services.Replace(typeof(ITraceWriter), new SimpleTracer());
}

Nur ein Ablaufverfolgungsschreiber kann aktiv sein. Standardmäßig legt die Web-API einen No-Op-Ablaufverfolgungsmodus fest, der nichts tut. (Der "no-op"-Tracer ist vorhanden, sodass der Ablaufverfolgungscode nicht überprüfen muss, ob der Ablaufverfolgungsschreiber NULL ist, bevor eine Ablaufverfolgung geschrieben wird.)

Funktionsweise der Web-API-Ablaufverfolgung

Die Ablaufverfolgung in der Web-API verwendet ein Fassadenmuster : Wenn die Ablaufverfolgung aktiviert ist, umschließt die Web-API verschiedene Teile der Anforderungspipeline mit Klassen, die Ablaufverfolgungsaufrufe ausführen.

Wenn Sie beispielsweise einen Controller auswählen, verwendet die Pipeline die IHttpControllerSelector-Schnittstelle . Wenn die Ablaufverfolgung aktiviert ist, fügt die Pipeline eine Klasse ein, die IHttpControllerSelector implementiert, aber die tatsächliche Implementierung durchläuft:

Die Web-API-Ablaufverfolgung verwendet das Fassadenmuster.

Zu den Vorteilen dieses Designs gehören:

  • Wenn Sie keinen Ablaufverfolgungsschreiber hinzufügen, werden die Ablaufverfolgungskomponenten nicht instanziiert und haben keine Auswirkungen auf die Leistung.
  • Wenn Sie Standarddienste wie IHttpControllerSelector durch Ihre eigene benutzerdefinierte Implementierung ersetzen, ist die Ablaufverfolgung nicht betroffen, da die Ablaufverfolgung vom Wrapperobjekt ausgeführt wird.

Sie können auch das gesamte Ablaufverfolgungsframework der Web-API durch Ihr eigenes benutzerdefiniertes Framework ersetzen, indem Sie den ITraceManager-Standarddienst ersetzen:

config.Services.Replace(typeof(ITraceManager), new MyTraceManager());

Implementieren Sie ITraceManager.Initialize , um Ihr Ablaufverfolgungssystem zu initialisieren. Beachten Sie, dass dadurch das gesamte Ablaufverfolgungsframework ersetzt wird, einschließlich des gesamten Ablaufverfolgungscodes, der in die Web-API integriert ist.