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:
Die CustomTrackingRecord-Objekte werden erstellt und mit benutzerdefinierten Daten aufgefüllt, die mit dem Datensatz ausgegeben werden sollen.
CustomTrackingRecord wird durch Aufrufen der Nachverfolgungsmethode von ActivityContext ausgegeben.
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
Öffnen Sie in Visual Studio die Projektmappendatei „CustomTrackingSample.sln“.
Drücken Sie STRG+UMSCHALT+B, um die Projektmappe zu erstellen.
Drücken Sie STRG+F5, um die Projektmappe auszuführen.