MSDN Magazin > Home > Ausgaben > 2007 > March >  Foundations: Überwachungsdienste in Window...
Foundations
Überwachungsdienste in Windows Workflow Foundation
Matt Milner

Codedownload verfügbar unter: Foundations2007_03.exe (178 KB)
Browse the Code Online
Eine der leistungsfähigsten Funktionen in Windows Workflow Foundation ist die Überwachung. Es ermöglicht Ihnen, Ereignisse, Aktivitätseigenschaften und benutzerdefinierte Daten in Ihren Workflows zu überwachen. In diesem Artikel erfahren Sie etwas über die Überwachungs-Infrastruktur und darüber, wie Sie den integrierten SQL Server-basierten Überwachungsdienst verwenden und benutzerdefinierte Überwachungsdienste für verschiedene Zwecke erstellen können. Bei dieser Gelegenheit soll gezeigt werden, wie man die überwachten Informationen verwenden kann und wie sich einige allgemeine Anforderungen von Anwendungen durch die Verwendung der Überwachung lösen lassen.
Viele Anwendungen erfordern Verständnis in die Ausführung der Programmlogik und der Verarbeitungsschritte. Grund dafür könnte die Einhaltung gesetzlicher Bestimmungen oder die Verwaltung von Aufgabenlisten auf der Grundlage von Meilensteinen für die Ausführung sein, aber es sind auch verschiedene andere Gründe möglich. Windows® Workflow Foundation stellt eine flexible Infrastruktur bereit, der Sie Ihre benutzerdefinierten Implementierungen überlagern können, statt für jede Anwendung ein eigenes Überwachungssystem zu erstellen. Dies vereinfacht das Entwicklungsmodell und ermöglicht Ihnen so, sich auf die Geschäftsanforderungen für die Überwachung zu konzentrieren.

Überwachungsarchitektur
Beim Hosten eines Workflows in Windows Workflow Foundation hosten Sie sowohl eine Workflow-Laufzeitumgebung als auch eine Reihe von Laufzeitdiensten. Viele Laufzeitendienste wie z. B. der Persistenzdienst sind erforderlich, damit mindestens eine Instanz in der Laufzeitumgebung registriert wird. Überwachungsdienste sind die Ausnahme, indem sie die Hinzufügung mehrerer Überwachungsdienste zur Laufzeit ermöglichen, um verschiedene Geschäftsanforderungen zu unterstützen. Dadurch können Sie mehrere verschiedene Überwachungsdienste auf eine Anwendung anwenden, wobei jeder Überwachungsdienst für eine bestimmte Implementierung verantwortlich ist.
Überwachung in Windows Workflow Foundation basiert auf einem zentralen Interceptor, der Aktivitäts- und Workflowereignisse überwacht und an jeden der konfigurierten Überwachungsdienste die entsprechenden Daten sendet. (Diese Architektur ist in Abbildung 1 dargestellt.) Der Überwachungsinterceptor wird über alle Ereignisse benachrichtigt, aber in den meisten Fällen ist nur eine Teilmenge dieser Ereignisse hilfreich. Wenn Sie außerdem mehrere Überwachungsdienste verwenden, ist es wahrscheinlich, dass jeder Dienst sich nur für eine eindeutige Teilmenge der Informationen interessiert. Folglich fragt der Überwachungsinterceptor jeden konfigurierten Überwachungsdienst nach einem Überwachungsprofil für jeden Workflowtyp.
Abbildung 1 Überwachungsarchitektur (Klicken Sie zum Vergrößern auf das Bild)
Überwachungsprofile liefern dem Interceptor Informationen über die Arten von Ereignissen, die der Überwachungsdienst empfangen möchte. Diese Ereignisse lassen sich in drei Kategorien einordnen: Workflow, Aktivität und Benutzer.
Workflowereignisse ermöglichen Ihnen die Überwachung der verschiedenen Zustände, in denen ein Workflow sein kann, sowie der Zeit, zu der sie stattgefunden haben. Bei Ereignissen, die benutzerdefinierte Ereignisargumente umfassen, wie z. B. mit WorkflowTerminated (Workflow beendet) oder WorkflowCompleted (Workflow abgeschlossen), werden die Ereignisargumente selbst überwacht und können später abgefragt werden.
Aktivitätsereignisse ermöglichen Ihnen, zu überwachen, wann eine Aktivität in einen bestimmten Status gelangte, sowie die spezifischen Werte der Eigenschaften in der Aktivität, als sie in diesen Status gelangte. Wenn Sie beispielsweise eine Aktivität haben, die E-Mails versendet, so können Sie die Adresseneigenschaft "An" überwachen, wenn die Aktivität in den Status "Geschlossen" eintritt.
Schließlich können Sie mittels Benutzerereignissen Daten manuell im Code Ihres Workflows oder Ihrer Aktivitäten überwachen.

Überwachungsprofile
Jeder Überwachungsdienst muss dem Überwachungs-Interceptor Überwachungsprofile liefern. Ein Dienst kann für alle Workflows das gleiche Profil oder für verschiedene Workflowtypen unterschiedliche Profile liefern. Es ist Aufgabe des Erstellers des Dienstes, zu bestimmen, wie Profile zu verwalten und herzustellen sind.
Überwachungsprofile können mit einem Objektmodell erstellt werden, das im Namespace System.Workflow.Runtime.Tracking oder direkt in XML zu finden ist. Sie werden gewöhnlich unter Verwendung des Objektmodells erstellt, aber dies ist weder die einzige Möglichkeit, das Profil darzustellen, noch ist es immer die beste. Aus diesem Grund kann das Überwachungsprofil zu XML serialisiert und aus XML deserialisiert werden. Sie können die TrackingProfileSerializer-Klasse verwenden, um ein TrackingProfile-Objekt zu XML-Text zu konvertieren oder umgekehrt Ein gutes Beispiel dafür und ein gutes Tool für die Bearbeitung eines Standard-Überwachungsprofils ist das Beispiel „Tracking Profile Designer“ (Überwachungsprofil-Designer) im Windows-SDK. Mit dieser Anwendung können Sie das Überwachungsprofil mithilfe der Workflow-Entwurfsoberfläche visuell definieren. Obwohl das Tool einige Einschränkungen hat, wie z. B. dass es keine Benutzer-Überwachungspunkte unterstützt, können Sie doch die serialisierte Form des Überwachungsprofils damit anzeigen. Es kann auch die Entwicklung und Bereitstellung von Überwachungsprofilen in vielen Szenarien beschleunigen.
Ein Überwachungsprofil ist im Wesentlichen eine Sammlung von Überwachungspunkten. Jeder Überwachungspunkt entspricht den Ereignistypen, die überwacht werden können, und liefert der Laufzeitumgebung Informationen über den Zeitpunkt, zu dem Daten zu extrahieren sind und welche Daten zu extrahieren sind. Um beispielsweise anzuzeigen, dass Workflowereignisse zu überwachen sind, muss ein WorkflowTrackPoint (Workflow-Überwachungspunkt) zum Überwachungsprofil hinzugefügt werden. Ein Überwachungspunkt enthält einen oder mehrere Überwachungsorte, die festlegen, wo und wann die Daten zu überwachen sind. Zum Beispiel erkennt die Eigenschaft „MatchingLocation“ („Übereinstimmender Ort“) auf einem WorkflowTrackPoint die verschiedenen Workflowereignisse, die zu überwachen sind. Der Code in Abbildung 2 zeigt, wie ein Überwachungsprofil erstellt wird. Es besitzt einen einzigen WorkflowTrackPoint, der anzeigt, dass der Dienst Misserfolgsbedingungen überwachen will, wie z. B. Ausnahmen, Beendigungen und Abbrüche von Workflows.
//create the profile object and set the version
TrackingProfile profile = new TrackingProfile();
profile.Version = new Version(1, 0, 0);

//define a tracking point
WorkflowTrackPoint wfTrack = new WorkflowTrackPoint();

//create a list of events we are interested in
List<TrackingWorkflowEvent> events = new List<TrackingWorkflowEvent>();
events.Add(TrackingWorkflowEvent.Aborted);
events.Add(TrackingWorkflowEvent.Terminated);
events.Add(TrackingWorkflowEvent.Exception);

//create a tracking location to indicate which events should be tracked
WorkflowTrackingLocation wfLocation = 
    new WorkflowTrackingLocation(events);

//set the matching location on the track point
wfTrack.MatchingLocation = wfLocation;

//add the track point to the profile
profile.WorkflowTrackPoints.Add(wfTrack);

„ActivityTrackPoint“ (Aktivitätsüberwachungspunkt) unterstützt eine viel umfangreichere Überwachung. Dies ist logisch, da Aktivitäten den Kern von Workflows darstellen. Der ActivityTrackPoint enthält Sammlungen sowohl von MatchingLocations (Übereinstimmende Orte) als auch von ExcludedLocations (Ausgeschlossene Orte), sodass Sie genau steuern können, wann Daten erfasst werden. Für beide Sammlungen definieren Sie einen ActivityTrackingLocation (Aktivitätsüberwachungsort), der alle Bedingungen umfasst, die erfüllt sein sollen.
Mit der ActivityTrackingLocation-Klasse können Sie die Aktivitäten festlegen, die Sie auf der Grundlage ihres Typs überwachen wollen. Sie können auch angeben, ob Sie bei abgeleiteten Aktivitäten eine Übereinstimmung wollen. Wenn Sie z. B. bei allen Aktivitäten eine Übereinstimmung wollen, würden Sie den Typ „System.ComponentModel.Activity“ verwenden und „MatchDerivedTypes“ auf „True“ einstellen. Dies würde zur Basisaktivitätsklasse und zu allen Aktivitäten passen, die davon abgeleitet sind, letztendlich zu allem. Sie fügen diese Informationen dann der MatchingLocations-Sammlung des ActivityTrackPoint hinzu, um anzuzeigen, dass Sie diese Ereignisse überwachen möchten, oder Sie fügen sie der ExcludedLocations-Sammlung hinzu, um anzuzeigen, dass diese Daten nicht erfasst werden sollen.
Für eine präzisere Steuerung können Sie Bedingungen in Form einer Eigenschaftsübereinstimmung angeben, die erfüllt sein muss, damit die Daten überwacht werden. Sie könnten z. B. auswählen, dass E-Mail-Nachrichten nur dann überwacht werden, wenn die Prioritätseigenschaft bei der SendEmail-Aktivität auf „Hoch“ eingestellt ist. Abbildung 3 zeigt hierfür ein Beispiel.
ActivityTrackPoint actTrack = new ActivityTrackPoint();

ActivityTrackingLocation actMatch = new ActivityTrackingLocation(
    typeof(SendEmail), false, new ActivityExecutionStatus[] { 
        ActivityExecutionStatus.Closed });

ActivityTrackingCondition condition = 
    new ActivityTrackingCondition("Priority", "High");
actMatch.Conditions.Add(condition);

actTrack.MatchingLocations.Add(actMatch);

profile.ActivityTrackPoints.Add(actTrack);

Sie können von der Aktivität oder dem Workflow auch Daten in Form von Eigenschaftswerten extrahieren. Z. B. können Sie die Eigenschaften „An“ und „Betreff“ der SendEmail-Aktivität überwachen, wenn die entsprechenden Orte im Workflow erreicht sind. Sie erreichen dies durch Hinzufügen der Elemente ActivityDataTrackingExtract oder WorkflowDataTrackingExtract zur Sammlung „Extrahiert“ im ActivityTrackPoint. Jeder ActivityDataTrackingExtract erkennt das Mitglied, das zu extrahieren und an den Überwachungsdienst zu senden ist. Beim Hinzufügen von Daten werden die Daten für den Aktivitäts-Überwachungspunkt extrahiert, sodass die überwachten Eigenschaften „An“ und „Betreff“ wie folgt aussehen:
actTrack.Extracts.Add(new ActivityDataTrackingExtract("To"));
actTrack.Extracts.Add(new ActivityDataTrackingExtract("Subject"));
UserTrackPoints (Benutzerüberwachungspunkte), die den Endpunkt der Überwachung erkennen, sind der flexibelste der drei Typen. Manchmal müssen Sie Daten aus Ihrem Workflow überwachen, aber die Daten sind nicht als eine Eigenschaft in einer Aktivität verfügbar. Oder Sie müssen möglicherweise in einem ActivityTrackingLocation (Aktivitätsüberwachungsort) mehr Logik als nur die Unterstützung einer Bedingung anwenden. In solchen Fällen können Sie die TrackData-Methode auf dem ActivityExecutionContext oder der Aktivitätsklasse aufrufen. So können Sie dem Überwachungsinterceptor Daten zusammen mit einem optionalen Schlüssel oder Namen für das Datenelement senden. Wenn ein Überwachungsdienst diese Daten empfangen soll, muss er einen UserTrackPoint mit den exakt übereinstimmenden Orten definieren. Sie können auch festlegen, dass Workflow- und Aktivitätsdatenextrakte Eigenschaften im Workflow oder der aktuell überwachten Aktivität haben müssen, wenn eine Übereinstimmung mit dem UserTrackPoint vorliegt.

SQL-Überwachungsdienst
Zu Windows Workflow Foundation gehört ein SQL Server-Überwachungsdienst, mit dem Sie für einen Workflowtyp Überwachungsprofile definieren und diese auf einem SQL Server bereitstellen können. Der Überwachungsdienst verwendet dann das Profil zur Laufzeit, um den Überwachungs-Interceptor zu konfigurieren. Zum SQL Server-Überwachungsdienst gehören mehrere zwingende Funktionen einschließlich Profilversionsverwaltung, Profilaktualisierungsbenachrichtigung und Datenpartitionierung.
Überwachungsprofile werden dem SQL-Überwachungsdienst bereitgestellt, indem die gespeicherte Prozedur „UpdateTrackingProfile“ aufgerufen und das serialisierte Überwachungsprofil zusammen mit Typinformationen für den Workflow und eine Versionsnummer eingereicht werden. Sie können diese gespeicherte Prozedur verwenden, um das für Ihren Workflowtyp spezifische Überwachungsprofil einzufügen, Sie müssen aber bei jeder Aktualisierung des Profils eine einmalige Versionsnummer verwenden. Mit dem bereits erwähnten TrackingProfileSerializer können Sie den XML-Text Ihres Profils abrufen, um ihn an die gespeicherte Prozedur zu übergeben.
Wenn Sie für Ihren Workflowtyp kein Überwachungsprofil angeben, verwendet der SQL-Überwachungsdienst die Einstellung „UseDefaultProfile“, um festzustellen, ob er dem Überwachungsinterceptor ein Standardprofil liefern soll. Das Standardprofil überwacht alle Statusereignisse für den Workflow und alle Aktivitäten. Es enthält auch übereinstimmende Orte zur Überwachung von gegebenenfalls durch Benutzer übermittelten Überwachungsereignissen. Wenn Sie dieses Standardverhalten nicht wollen, müssen Sie die Eigenschaft „UseDefaultProfile“ beim Konfigurieren des SQL-Überwachungsdienstes auf „False“ einstellen. Dann werden nur die Workflowtypen mit angegebenen Profilen überwacht.
Um seine Aktualität sicherzustellen, fragt der Überwachungsinterceptor regelmäßig jeden Überwachungsdienst nach Profilen, die er bereits empfangen hat. Um wiederholtes Laden oder Erstellen von Überwachungsprofilen zu vermeiden, kann ein Überwachungsdienst die IProfileNotification-Schnittstelle implementieren. Diese definiert zwei Ereignisse: ProfileUpdated (Profil aktualisiert) und ProfileRemoved (Profil entfernt). Wenn ein Überwachungsdienst diese Schnittstelle implementiert, fragt der Überwachungsinterceptor nicht nach aktualisierten Profilinformationen, sofern nicht eines dieser Ereignisse gemeldet wird. Um dieses Modell zu unterstützen, fragt der SQL Server-Überwachungsdienst regelmäßig (standardmäßig alle 60 Sekunden) die Datenbank ab, um festzustellen, ob das Überwachungsprofil für einen Workflowtyp aktualisiert oder entfernt wurde. Sie können konfigurieren, wie oft der Dienst nach Aktualisierungen fragt, indem Sie die Eigenschaft ProfileChangeCheckInterval auf einen Wert einstellen, der die Millisekunden zwischen den Abfragen darstellt.
Da sich in einer Produktionsumgebung die Überwachungsdaten schnell ansammeln können, unterstützt der SQL-Überwachungsdienst Datenpartitionierung. Sie können konfigurieren, dass Daten nach Tag, Woche, Monat oder Jahr segmentiert werden. Der Dienst erstellt Überwachungstabellen für jeden Zeitraum. Außerdem können Sie steuern, ob Daten bei Bedarf (so kann es für Ausfallzeit geplant werden) oder automatisch (wenn der Workflow abschließt) abgelegt werden. Um diese Einstellung zu konfigurieren, stellen Sie die Eigenschaft PartitionOnCompletion auf dem SQL Server-Überwachungsdienst auf „True“ ein, um anzuzeigen, dass jeder Workflow zur entsprechenden Überwachungspartition abgelegt werden muss, wenn er abschließt. Um die Daten manuell zu partitionieren, rufen Sie die gespeicherte Prozedur PartitionCompletedWorkflowInstances in der Überwachungsdatenbank auf.

Abfrage von Überwachungsdaten
Wenn Sie mithilfe des SQL-Überwachungsdienstes Daten erfassen, sind die Daten auf dem SQL Server gespeichert. Das bedeutet, dass Sie zum Anzeigen und Analysieren der Daten herkömmliche Berichterstellungstools verwenden können. Bei einigen Szenarien jedoch werden Sie die Workflowdaten in Ihrer Anwendung abfragen wollen. Sie brauchen dann nicht mühsam SQL-Abfragen zu schreiben und die richtigen Beziehungen in der Datenbank festzustellen: Zu Windows Workflow Foundation gehört eine Schnittstelle zur Programmierung von Überwachungsabfragen, die Ihnen die Suche nach Überwachungsinformationen für Workflowinstanzen ermöglicht. Die Informationen werden als eine Klasse zurückgegeben, die Zugriff auf alle von Ihrem Überwachungsprofil angegebenen überwachten Ereignisse und Daten bereitstellt.
Die SqlTrackingQuery-Klasse ermöglicht Ihnen, entweder das Laden der Überwachungsdaten einer bestimmten Workflowinstanz mithilfe der Instanz-ID dieses Workflows zu versuchen oder mithilfe eines separaten Parametersatzes eine Liste von Workflows abzufragen. Beim Laden einer bestimmten Instanz verwenden Sie die TryGetWorkflow-Methode, die einen booleschen Wert zurückgibt, der anzeigt, ob die Anforderung erfolgreich war. Um mehrere Workflows abzufragen, verwenden Sie die GetWorkflows-Methode, die eine SqlTrackingQueryOptions-Instanz erfordert.
Die Abfrageoptionen erlauben Ihnen, Parameter zu definieren, um sie bei der Suche nach Workflows in der Überwachungsdatenbank zu verwenden. Die einfachsten Optionen umfassen einen Minimum- und einen Maximumwert für das Datum sowie Typ und Status des Workflows. Z. B. können Sie so konfigurieren, dass alle mit Ihrem Workflowtyp übereinstimmenden Workflows gesucht werden, deren Status „Abgeschlossen“ ist und die zwischen „Heute“ und „Vor einer Woche“ liegen. So können Sie gezielt Informationen zu einem Workflowtyp und dessen Ergebnis abrufen.
Auf ein Überwachungsprofil, mit dem Sie Ihr Interesse an Fehlerbedingungen anzeigen können, wurde bereits hingewiesen. Mithilfe des in Abbildung 4 gezeigten Codes können Sie die Datenbank nach allen Workflowinstanzen abfragen, die beendet wurden, und die Ausnahmedetails ausgeben. Beachten Sie, dass die Überwachungsinformationen die Ausnahmedetails als Ereignisargumente des beendeten Ereignisses enthalten, die überwacht wurden.
SqlTrackingQueryOptions options = new SqlTrackingQueryOptions();
options.WorkflowStatus = WorkflowStatus.Terminated;

SqlTrackingQuery query = new SqlTrackingQuery(connectionString);
IList<SqlTrackingWorkflowInstance> workflows = 
    query.GetWorkflows(options);

foreach (SqlTrackingWorkflowInstance workflow in workflows)
{
    foreach(WorkflowTrackingRecord workflowEvent in 
        workflow.WorkflowEvents)
    {
        TrackingWorkflowTerminatedEventArgs args = 
            workflowEvent.EventArgs as 
                TrackingWorkflowTerminatedEventArgs;
        if (args != null)
        {
            Console.WriteLine(
                "workflow {0} terminated with exception: {1}", 
            workflow.WorkflowInstanceId, args.Exception.Message);
        }                  
    }
}

Sie können auch auf der Grundlage extrahierter Werte suchen. Wenn Sie z. B. ein Überwachungsprofil haben, das so konfiguriert ist, dass es die Adresse „An“ einer SendEmail-Aktivität extrahiert, so können Sie eine Abfrage derjenigen Workflowinstanzen schreiben, bei denen die Adresse „An“ einen bestimmten Wert hat, wie z. B. einen besonderen Mitarbeiter oder Partner. Der folgende Code ist ein Beispiel für die Verwendung von TrackingDataItemValue-Elementen in SqlTrackingQueryOptions, um die Suche auf bestimmte Elemente zu verfeinern, die auf extrahierten Werten basieren:
SqlTrackingQueryOptions options = new SqlTrackingQueryOptions();
TrackingDataItemValue item = new TrackingDataItemValue(
    "sendEmail1", "To", "highpriority@example.com");
options.TrackingDataItems.Add(item);

SqlTrackingQuery query = new SqlTrackingQuery(connectionString);
IList<SqlTrackingWorkflowInstance> workflows = 
    query.GetWorkflows(options);
Wenn Sie die SQL Server-Datenbank für das Berichtswesen oder andere Zwecke direkt abfragen, sollten Sie eher die in der Tabelle definierten Ansichten als die Tabellen direkt verwenden. Dies ist ganz allgemein sinnvoll, aber an dieser Stelle ist es sehr wichtig, da die Ansichten Daten von allen Überwachungspartitionen enthalten, die erstellt wurden. Wenn Sie die Ansichten verwenden, ersparen Sie sich die Mühe, die Daten aus allen diesen Tabellen zusammenzuführen.

Benutzerdefinierte Überwachungsdienste
Obwohl die Überwachung von Daten in einer SQL Server-Datenbank ein wichtiger und wahrscheinlich der häufigste Verwendungsfall ist, ist sie nicht das einzige Szenario für die Verwendung von Überwachungsinformationen. Da es sich dabei eine gängige Anforderung handelt, hat sich Microsoft dafür entschieden, diesen umfangreichen Dienst in Windows Workflow Foundation zu integrieren. Allerdings muss ein solcher Dienst mit einer derart breitgestreuten Verwendung so allgemein wie möglich sein. Dies bedeutet, dass er möglicherweise in vielen Situationen nicht geeignet ist. In solchen Fällen können Sie einen benutzerdefinierten Überwachungsdienst erstellen.
Es gibt viele Anforderungen in Workflowlösungen, die mithilfe eines benutzerdefinierten Überwachungsdienstes erfüllt werden können. Hier erfahren Sie im Grundsatz, wie Sie Ihren eigenen Überwachungsdienst erstellen, und Sie finden ein paar Beispiele für benutzerdefinierte Dienste, die gängige Anforderungen erfüllen. Wichtig ist hierbei, dass die Überwachung Ihr Einblick in den Workflow ist. Wenn Sie erst einmal verstehen, wie Sie einen Überwachungsdienst mit Überwachungsprofilen konfigurieren, damit Sie die Ergebnisse abrufen können, die Sie brauchen, dann geht es nur noch darum, wie Ihr benutzerdefinierter Dienst die überwachten Informationen nutzt oder darstellt.
Um einen benutzerdefinierten Überwachungsdienst zu erstellen, müssen Sie zwei Dinge tun. Zuerst müssen Sie festlegen, wie Ihre Überwachungsprofile für Ihren Dienst erstellt werden sollen. In einigen Fällen kann das Profil statisch und über alle Workflowtypen hinweg gleichbleibend sein. In diesem Fall können Sie Ihr Profil in Code erstellen und es einfach an die Laufzeitumgebung zurückgeben, wenn das Profil angefordert wird. Wenn jedoch Ihr Überwachungsdienst mehrere Profile oder Profilversionen unterstützen muss, dann brauchen Sie eine Möglichkeit, diese Informationen zu speichern und sie von Ihrem Überwachungsdienst abzurufen.
Als Nächstes müssen Sie zwei Klassen implementieren, die das Laufzeitverhalten Ihres Dienstes bereitstellen: Einen Überwachungsdienst und einen Überwachungskanal. Die Überwachungsdienstklasse dient als Workflowlaufzeitdienst und ist die direkte Schnittstelle, über die die Hostanwendung und die Laufzeitumgebung mit Ihrem Überwachungsdienst interagieren. Sie erstellen eine Instanz dieser Klasse und fügen sie der Workflow-Laufzeitumgebung mithilfe von Code oder Konfiguration genauso hinzu wie jeden anderen Dienst.
Die Überwachungsdienstklasse hat zwei Hauptaufgaben: Einerseits dem Überwachungsinterceptor Überwachungsprofile bereitzustellen und andererseits Überwachungskanäle bereitzustellen, auf die der Listener Daten schreiben kann. Der Überwachungskanal ist die von Ihnen implementierte Klasse, die für Empfang und Verarbeitung der Überwachungsdaten verantwortlich ist. Er kann diese Daten auf einen Speicher wie z. B. einen SQL Server oder das Windows-Ereignisprotokoll schreiben, er kann Ereignisse auslösen, wie z. B. Windows Management Instrumentation (WMI)-Ereignisse für Vorgänge, oder er kann die Daten zurück zum Überwachungsdienst senden, damit sie gespeichert bleiben und für die Hostanwendung verfügbar sind. Es gibt sicherlich auch andere Optionen und was Sie mit den Daten machen, hängt von Ihren Anforderungen ab. Ihre benutzerdefinierten Überwachungsdienste unterscheiden sich durch die von ihnen verwendeten Überwachungsprofile und dadurch, wie sie die empfangenen Daten verarbeiten.
Am einfachsten ist es, mit dem Überwachungskanal zu beginnen, da dieser zwei einfache Methoden hat: Send (Senden) und InstanceCompletedOrTerminated (Instanz abgeschlossen oder beendet). Ihr Überwachungsdienst wird aufgefordert, für jede Workflowinstanz einen Überwachungskanal bereitzustellen, und es ist übliche Praxis, für jede Anforderung eine einmalige Instanz Ihres Überwachungskanals bereitzustellen. Meist stellen Sie einen Konstruktor bereit, der TrackingParameters als Parameter verwendet. Diese Informationen brauchen Sie möglicherweise bei Ihrer Implementierung der anderen Methoden. Die TrackingParameters-Klasse enthält Informationen über die gerade überwachte Workflowinstanz (wie z. B. die Instanz-ID), Zugriff auf die Definition der Stammaktivität und Informationen zu übergeordneten Aktivitäten und aufrufenden Workflows (wenn dieser Workflow von einem anderen Workflow aus aufgerufen wurde).
Die InstanceCompletedOrTerminated-Methode ermöglicht Ihrem Überwachungsdienst, benachrichtigt zu werden, wenn ein Workflow abgeschlossen ist, sodass sie etwaige Ressourcen bereinigen kann, die mit der Überwachung des Workflows zusammenhängen. Es ist eine Selbstverständlichkeit, dass der Zugriff auf die von TrackingParameters gelieferte Workflowinstanz-ID erforderlich ist, da die InstanceCompletedOrTerminated-Methode keine Parameter besitzt.
Die Send-Methode auf Ihrem Überwachungskanal wird für jeden Überwachungsdatensatz aufgerufen, der im Überwachungsprofil angefordert wurde. Beim Emulieren des Profils gibt es Workflow-, Aktivitäts- und Benutzer-Überwachungsdatensätze, die sich alle von der Basisklasse „TrackingRecord“ ableiten. Bei der Send-Methode sind Sie für die Überprüfung verantwortlich, welche Art von Überwachungsdatensatz übermittelt wurde, und Sie verarbeiten ihn dann dementsprechend. Wenn Sie wissen, dass für Ihr Überwachungsprofil beispielsweise keine Benutzerüberwachungsereignissen benötigt werden, dann brauchen Sie in Ihrem Überwachungskanal keine Benutzer-Überwachungsdatensätze zu verarbeiten.
Die Überwachungsdienstklasse ist selbst für die Verwaltung der Überwachungsprofile verantwortlich. Die Überwachungsdienst-Basisklasse stellt mehrere Methoden zum Abrufen des Profils bereit, mit denen Sie Profile verwalten können, die auf Workflowtyp und Workflowinstanz basieren. Das bedeutet, dass Ihr Dienst eine breite Palette von Profilen zurückgeben kann, angefangen von solchen, die für alle Workflows gleich sind, bis hin zu solchen, die für jede Workflowinstanz einmalig sind.
Es gibt für die GetProfile-Methode zwei Überladungen. Eine übernimmt eine Instanz-ID und die andere den Typ und die Profilversionsnummer. Auch TryGetProfile übernimmt die Typeninformationen. In allen diesen Fällen besteht die Aufgabe Ihres benutzerdefinierten Überwachungsdienstes darin, ein Überwachungsprofil zurückzugeben, das zu dem Typ oder der Instanz passt.
Es gibt auch eine Methode mit dem Namen TryReloadProfile, die die Laufzeitumgebung aufruft, um ein aktualisiertes Profil abzurufen, wenn ein solches vorhanden ist. Um sicherzustellen, dass der Überwachungsinterceptor auf dem neuesten Stand ist, wird regelmäßig ein aktualisiertes Profil bei Ihrem Überwachungsdienst abgefragt. Statt bei dieser Anforderung jedes Mal ein neues Profil zu erstellen oder eines herauszusuchen, können Sie in Ihrem benutzerdefinierten Überwachungsdienst die IProfileNotification-Schnittstelle implementieren. Zur IProfileNotifcation-Schnittstelle gehören zwei Ereignisse: ProfileRemoved (Profil aktualisiert) und ProfileUpdated (Profil entfernt). Wenn Sie diese Schnittstelle in Ihrem Überwachungsdienst implementieren, fragt der Überwachungsinterceptor keine Aktualisierungen ab. Stattdessen wartet er auf Benachrichtigung über etwaige Aktualisierungen durch die Ereignisse an dieser Schnittstelle.
Im Codedownload sind für diesen Artikel mehrere Beispiele für Überwachungsdienste enthalten. Das Beispiel „Aktueller Status“ verwendet Überwachung, um den aktuellen Status eines Statusmechanismusworkflows abzurufen und ihn für die Hostanwendung verfügbar zu machen. Das Überwachungsprofil für diesen Dienst enthält einen Aktivitätsüberwachungspunkt für den ausführenden Status von Statusaktivitäten. Der Überwachungskanal aktualisiert dann ein Wörterbuch in der Überwachungsdienstklasse mit dem aktuellen Statusnamen, wenn ein Aktivitäts-Überwachungsdatensatz empfangen wird. Dies ist ein Beispiel für einen Dienst, der für alle Workflows das gleiche Profil hat und Daten zurück an den Dienst schreibt, sodass dieser von der Hostanwendung abgefragt werden kann.
Das andere im heruntergeladenen Code enthaltene Beispiel für einen Überwachungsdienst bietet sich für die Lösung eines verbreiteten Entwicklerproblems in Windows Workflow Foundation an. Wegen der Art und Weise, wie Workflows ausgeführt und vom Host getrennt werden, ist es kein einfaches Verfahren, einen Verweis zum ausgeführten Workflow und den Werten der Eigenschaft „Extrahieren“ abzurufen. Dies ist eine allgemeine Anforderung, besonders in ASP.NET-Szenarien. Wenn ein ManualWorkflowScheduler mit der Ausführung der Schritte im Workflow fertig ist, kann es notwendig sein, die Benutzeroberfläche mit Eigenschaftswerten aus dem Workflow zu aktualisieren.
Auch wenn die Informationen im Workflow mithilfe der CallExternalMethod-Aktivität übergeben werden können, ist dies nicht immer die gewünschte Lösung und kann bei einem großen Projekt zu Überlastungen führen. Das Beispiel „Überwachungsdienst für Workfloweigenschaften“ verwendet Überwachung, um dieses Problem zu lösen. In diesem Überwachungsdienst ist das zurückgegebene Profil für jeden Workflowtyp unterschiedlich, um die verschiedenen Eigenschaften im Workflow widerzuspiegeln. Spiegelung wird verwendet, um eine Sammlung von Workflowdaten-Überwachungsextrakten zu erstellen und diese einem Aktivitätsüberwachungspunkt hinzuzufügen. Die Überwachung erfolgt beim Abschluss des Ereignisses jeder Aktivität. Daher werden nach dem Abschluss jeder Aktivität die Eigenschaftswerte aus der Workflowinstanz extrahiert und zum Überwachungskanal gesendet. Der Kanal aktualisiert dann in dem Dienst ein Wörterbuch und macht diese Werte für die Hostanwendung verfügbar.
Dies sind zwei ziemlich einfache Beispiele für benutzerdefinierte Überwachungsdienste, beide behandeln aber allgemeine Entwicklerszenarien und stellen einfache, wiederverwendbare Implementierungen bereit, die die vorhandene Überwachungsinfrastruktur nutzen. Ohne die Basis, auf der aufgebaut werden konnte, wäre jede dieser Herausforderungen viel größer gewesen, hätte mehr benutzerdefinierteren Code erfordert und die Lösungen wären wahrscheinlich nicht konsistent.
Wie Sie sehen können, sind die Überwachungsdienste in Windows Workflow Foundation äußerst flexibel und können bei der Erfüllung vieler Geschäftsanforderungen helfen. Überwachung ist der Schlüssel zur Übersichtlichkeit des Workflows und benutzerdefinierte Überwachungsdienste sind Ihr Tool, um diese Übersichtlichkeit in Ihren Anwendungen zu erschließen.

Senden Sie Ihre Fragen und Kommentare an  mmnet30@microsoft.com.


Matt Milner ist unabhängiger Softwareberater und Schulungsleiter für PluralSight mit Spezialisierung in Microsoft-Technologien wie .NET, Webdienste, Windows Workflow Foundation, Windows Communication Foundation und BizTalk Server. Matt lebt mit seiner Frau Kristen und seinen zwei Söhnen in Minnesota. Sie erreichen Matt über sein Blog unter pluralsight.com/blogs/matt.

Page view tracker