Benutzerdefinierte Nachverfolgung

Anhand des Beispiels zur benutzerdefinierten Nachverfolgung wird veranschaulicht, wie eine benutzerdefinierte Nachverfolgungskomponente erstellt und der Inhalt der Nachverfolgungsdaten in die Konsole geschrieben wird. Außerdem wird veranschaulicht, wie mit benutzerdefinierten Daten aufgefüllte CustomTrackingRecord-Objekte ausgegeben werden. Die konsolenbasierte Nachverfolgungskomponente filtert die vom Workflow ausgegebenen TrackingRecord-Objekte mit einem im Code erstellten Nachverfolgungsprofilobjekt.

Beispieldetails

Windows Workflow Foundation (WWF) stellt eine Infrastruktur zur Nachverfolgung der Ausführung einer Workflowinstanz bereit. Die Nachverfolgungslaufzeit implementiert eine Workflowinstanz, um Ereignisse in Verbindung mit dem Workflowlebenszyklus, Ereignisse aus den Workflowaktivitäten sowie benutzerdefinierte Nachverfolgungsereignisse auszugeben. In der folgenden Tabelle sind die primären Komponenten der Überwachungsinfrastruktur aufgeführt.

Komponente BESCHREIBUNG
Überwachungslaufzeit Stellt die Infrastruktur bereit, um Überwachungsdatensätze auszugeben.
Überwachungsteilnehmer Verarbeitet die Nachverfolgungsdatensätze. .NET Framework 4 wird mit einem Nachverfolgungsteilnehmer geliefert, der Nachverfolgungsdatensätze als Ereignisse der Ereignisablaufverfolgung für Windows (ETW) schreibt.
Überwachungsprofil Ein Filtermechanismus, der einem Überwachungsteilnehmer das Abonnieren einer Teilmenge der Überwachungsdatensätze ermöglicht, die von einer Workflowinstanz ausgegeben werden.

In der folgenden Tabelle sind die Überwachungsdatensätze aufgeführt, die von der Workflowlaufzeit ausgegeben werden.

Nachverfolgungsdatensatz BESCHREIBUNG
Überwachungsdatensätze zur Workflowinstanz. Beschreiben den Lebenszyklus der Workflowinstanz. Wenn der Workflow gestartet oder abgeschlossen wird, wird beispielsweise ein Instanzdatensatz ausgegeben.
Nachverfolgungsdatensätze zum Aktivitätszustand. Führen Einzelheiten zur Aktivitätsausführung auf. Diese Datensätze geben den Zustand einer Workflowaktivität an, z. B. wenn eine Aktivität geplant oder abgeschlossen wird oder wenn ein Fehler ausgelöst wird.
Datensatz zur Wiederaufnahme von Lesezeichen. Wird immer dann ausgegeben, wenn ein Lesezeichen in einer Workflowinstanz wieder aufgenommen wird.
Benutzerdefinierte Nachverfolgungsdatensätze. Ein Workflowautor kann benutzerdefinierte Nachverfolgungsdatensätze erstellen und in einer benutzerdefinierten Aktivität ausgeben.

Die Nachverfolgungskomponente abonniert eine Teilmenge der ausgegebenen TrackingRecord-Objekte mit Nachverfolgungsprofilen. Ein Überwachungsprofil enthält Überwachungsabfragen, die das Abonnieren eines bestimmten Typs von Überwachungsdatensätzen ermöglichen. Überwachungsprofile können im Code oder in der Konfiguration angegeben werden.

Benutzerdefinierte Nachverfolgungskomponente

Die API der Nachverfolgungskomponente ermöglicht eine Erweiterung der Nachverfolgungslaufzeit mit einer vom Benutzer bereitgestellten Nachverfolgungskomponente. Diese kann benutzerdefinierte Logik enthalten, mit der von der Workflowlaufzeit ausgegebene TrackingRecord-Objekte behandelt werden.

Zum Schreiben einer Nachverfolgungskomponente muss der Benutzer TrackingParticipant implementieren. Die Track-Methode muss von der benutzerdefinierten Komponente implementiert werden. Diese Methode wird aufgerufen, wenn ein TrackingRecord-Objekt von der Workflowlaufzeit ausgegeben wird.

public abstract class TrackingParticipant
{
    protected TrackingParticipant();

    public virtual TrackingProfile TrackingProfile { get; set; }
    public abstract void Track(TrackingRecord record, TimeSpan timeout);
}

Der vollständige Nachverfolgungsteilnehmer wird in der Datei „ConsoleTrackingParticipant.cs“ implementiert. Das folgende Codebeispiel ist die Track-Methode für den benutzerdefinierten Nachverfolgungsteilnehmer.

protected override void Track(TrackingRecord record, TimeSpan timeout)
{
    ...
    WorkflowInstanceRecord workflowInstanceRecord = record as WorkflowInstanceRecord;
    if (workflowInstanceRecord != null)
    {
        Console.WriteLine(String.Format(CultureInfo.InvariantCulture,
            " Workflow InstanceID: {0} Workflow instance state: {1}",
            record.InstanceId, workflowInstanceRecord.State));
    }

    ActivityStateRecord activityStateRecord = record as ActivityStateRecord;
    if (activityStateRecord != null)
    {
        IDictionary<String, object> variables = activityStateRecord.Variables;
        StringBuilder vars = new StringBuilder();

        if (variables.Count > 0)
        {
            vars.AppendLine("\n\tVariables:");
            foreach (KeyValuePair<string, object> variable in variables)
            {
                vars.AppendLine(String.Format(
                    "\t\tName: {0} Value: {1}", variable.Key, variable.Value));
            }
        }
        Console.WriteLine(String.Format(CultureInfo.InvariantCulture,
            " :Activity DisplayName: {0} :ActivityInstanceState: {1} {2}",
                activityStateRecord.Activity.Name, activityStateRecord.State,
            ((variables.Count > 0) ? vars.ToString() : String.Empty)));
    }

    CustomTrackingRecord customTrackingRecord = record as CustomTrackingRecord;

    if ((customTrackingRecord != null) && (customTrackingRecord.Data.Count > 0))
    {
        ...
    }
    Console.WriteLine();

}

Im folgenden Codebeispiel wird die Konsolenkomponente der Workflowaufrufinstanz hinzugefügt.

ConsoleTrackingParticipant customTrackingParticipant = new ConsoleTrackingParticipant()
{
    ...
    // The tracking profile is set here, refer to Program.CS
...
}

WorkflowInvoker invoker = new WorkflowInvoker(BuildSampleWorkflow());
invoker.Extensions.Add(customTrackingParticipant);

Ausgeben von benutzerdefinierten Nachverfolgungsdatensätzen

In diesem Beispiel wird auch die Fähigkeit zur Ausgabe von CustomTrackingRecord-Objekten aus einer benutzerdefinierten Workflowaktivität veranschaulicht:

Im folgenden Beispiel wird veranschaulicht, wie CustomTrackingRecord-Objekte innerhalb einer benutzerdefinierten Aktivität ausgegeben werden.

// Create the Custom Tracking Record
CustomTrackingRecord customRecord = new CustomTrackingRecord("OrderIn")
{
    Data =
    {
        {"OrderId", 200},
        {"OrderDate", "20 Aug 2001"}
    }
};

// Emit custom tracking record
context.Track(customRecord);

So verwenden Sie dieses Beispiel

  1. Öffnen Sie in Visual Studio die Projektmappendatei „CustomTrackingSample.sln“.

  2. Drücken Sie STRG+UMSCHALT+B, um die Projektmappe zu erstellen.

  3. Drücken Sie STRG+F5, um die Projektmappe auszuführen.

Siehe auch