Freigeben über


Aufgabe 4: Verwenden des Windows Workflow-Überwachungsdiensts

In der vorherigen Aufgabe haben Sie es dem SqlWorkflowPersistenceService-Dienst ermöglicht, den Workflow beizubehalten, wenn dieser in den Leerlauf wechselt.

In dieser Aufgabe verwenden Sie den SqlTrackingService-Dienst zum Erfassen der Workflowinstanz und von Aktivitätsereignissen, von denen der Workflow ausgeführt wird. Der SqlTrackingService-Dienst wird unter Verwendung der AddService-Methode hinzugefügt, die in WorkflowRuntime definiert ist, um die SqlTrackingQuery-Klasse zu verwenden.

Nachdem die Ausführung des Workflows beendet ist, können Sie die SqlTrackingQuery-Klasse zum Extrahieren der Überwachungsinformationen aus der Überwachungsdatenbank verwenden. Beim Erstellen einer Instanz der SqlTrackingQuery-Klasse durch Übermitteln einer Verbindungszeichenfolge für die verwendete Überwachungsdatenbank können Sie durch die Überwachungsdatensätze blättern, indem Sie auf die ActivityEvents-Eigenschaft des SqlTrackingWorkflowInstance-Objekts zugreifen. Darin ist eine Auflistung von ActivityTrackingRecord-Objekten enthalten, um Überwachungsinformationen für die Aktivitäten im Workflow anzuzeigen. Außerdem können Sie dieselbe Prozedur zum Überwachen der Workflowinstanzereignisse verwenden, indem Sie auf die WorkflowEvents-Eigenschaft zugreifen, die in der SqlTrackingWorkflowInstance-Klasse definiert ist.

Hinweis

Durch die von Windows Workflow Foundation installierten SQL-Dienste werden Microsoft SQL Server zum Speichern von Informationen verwendet. Sie können für diese Aufgaben Microsoft SQL Server 2005 Express, Microsoft SQL Server 2000 oder höhere Versionen oder Microsoft SQL Server 2000 Desktop Engine (MSDE) verwenden.

Hinweis

Die für diese Dienste erforderlichen Datenbanken werden nicht vom Setup von Windows Workflow Foundation installiert. Die SQL-Skripte zum Erstellen und Konfigurieren der Datenbanken für diese Dienste werden jedoch vom Setup von Windows Workflow Foundation installiert.

Hinweis

Sie werden aufgefordert, die Übungen der Reihe nach auszuführen. Dies ist jedoch nicht erforderlich. Sie können durch Öffnen des Beispielprojekts bei dieser Übung beginnen und mit den Schritten im folgenden Abschnitt fortfahren. Darüber hinaus muss die von der Anwendung verwendete Persistenzdatenbank erstellt werden, damit das Projekt ordnungsgemäß ausgeführt wird. Führen Sie dazu die Prozedur "Erstellen der SQL-Persistenzdatenbank" unter Aufgabe 3: Verwenden des Windows Workflow-Persistenzdiensts aus.

So erstellen Sie die SQL-Überwachungsdatenbank:

  1. Erstellen Sie mit Microsoft SQL Server 2005 Express, Microsoft SQL Server 2000 oder höheren Versionen oder Microsoft SQL Server 2000 Desktop Engine (MSDE) eine neue Datenbank mit dem Namen WorkflowTrackingStore, indem Sie folgende SQL-Abfrageanweisung verwenden.

    CREATE DATABASE WorkflowTrackingStore
    
  2. Wählen Sie im SQL Query Analyzer-Arbeitsbereich in der Liste der verfügbaren Datenbanken die in Schritt 1 erstellte Datenbank aus.

  3. Klicken Sie im Menü Datei auf Öffnen, und öffnen Sie das SQL-Skript %WINDIR%\Microsoft.NET\Framework\v3.0\Windows Workflow Foundation\SQL\<Sprache>\Tracking_Schema.sql.

  4. Führen Sie die Abfrage aus, indem Sie auf Ausführen klicken oder F5 drücken, um die Tabellen des SQL-Überwachungsdiensts zu erstellen.

  5. Klicken Sie im Menü Datei auf Öffnen, und öffnen Sie das SQL-Skript %WINDIR%\Microsoft.NET\Framework\v3.0\Windows Workflow Foundation\SQL\<Sprache>\Tracking_Logic.sql.

  6. Führen Sie die Abfrage aus, indem Sie auf Ausführen klicken oder F5 drücken, um die gespeicherten Prozeduren des SQL-Überwachungsdiensts zu erstellen.

So importieren Sie die SQL-Namespaces:

  • Fügen Sie folgende Direktiven der Datei hinzu, die die Program-Klasse enthält, um die zum Verwenden der Überwachung und der SqlTrackingQuery-Klasse erforderlichen Typen zu importieren.

    using System.Workflow.Runtime.Tracking;
    using System.Data;
    using System.Data.SqlClient;
    using System.Data.SqlTypes;
    

So ändern Sie App.config für SqlTrackingService:

  1. Erstellen Sie im Services-Element in der Datei App.config ein neues Element mit der Bezeichnung add.

  2. Fügen Sie im add-Element ein Attribut mit dem Namen type hinzu, der über einen Wert von System.Workflow.Runtime.Tracking.SqlTrackingService, System.Workflow.Runtime, Version=3.0.00000.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 verfügt.

  3. Fügen Sie im add-Element ein Attribut mit dem Namen connectionString hinzu, der über einen Wert von Initial Catalog=WorkflowTrackingStore;Data Source=localhost;Integrated Security=SSPI; verfügt.

    <add type="System.Workflow.Runtime.Tracking.SqlTrackingService, System.Workflow.Runtime, Version=3.0.00000.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" connectionString="Initial Catalog=WorkflowTrackingStore;Data Source=localhost;Integrated Security=SSPI;"/>
    

So verfolgen Sie Workflowereignisse:

  1. Erstellen Sie in der Program-Klasse des Projekts ein neues statisches Feld vom Typ String mit dem Namen connectionString.

    Weisen Sie diesem Feld den Wert "Initial Catalog=WorkflowTrackingStore;Data Source=localhost;Integrated Security=SSPI;". zu.

    public static string connectionString =
        "Initial Catalog=WorkflowTrackingStore;" +
        "Data Source=localhost;Integrated Security=SSPI;";
    
  2. Erstellen Sie in der Program-Klasse des Projekts eine neue statische Methode mit der Bezeichnung GetInstanceTrackingEvents, von der ein Guid-Parameter mit der Bezeichnung instanceId akzeptiert wird.

  3. Erstellen Sie in der GetInstanceTrackingEvents-Methode ein neues SqlTrackingQuery-Objekt, und übermitteln Sie die connectionString-Variable als Parameter an den Konstruktor.

  4. Erstellen Sie eine SqlTrackingWorkflowInstance-Variable mit der Bezeichnung sqlTrackingWorkflowInstance, und übermitteln Sie dieses Objekt zusammen mit dem instanceId-Parameter an die TryGetWorkflow-Methode, die im SqlTrackingQuery-Objekt definiert ist. Von dieser TryGetWorkflow-Methode wird ein boolescher Wert zurückgegeben, mit dem Erfolg oder Fehlschlagen des Vorgangs angegeben wird. Falls von der Methode false zurückgegeben wird, wird eine Fehlermeldung ausgegeben und von der Methode zurückgegeben.

  5. Blättern Sie durch jeden WorkflowTrackingRecord, der in der im sqlTrackingWorkflowInstance-Objekt definierten WorkflowEvents-Auflistung enthalten ist.

    Zeigen Sie die TrackingWorkflowEvent-Eigenschaft und die EventDateTime-Eigenschaft mithilfe der WriteLine-Methode an. GetInstanceTrackingEvents sollte folgendem Beispiel entsprechend dargestellt werden:

    static void GetInstanceTrackingEvents(Guid instanceId)
    {
        SqlTrackingQuery sqlTrackingQuery = new SqlTrackingQuery(connectionString);
    
        SqlTrackingWorkflowInstance sqlTrackingWorkflowInstance;
        if (!sqlTrackingQuery.TryGetWorkflow(instanceId, out sqlTrackingWorkflowInstance))
        {
            Console.WriteLine("Could not retrieve SqlTrackingWorkflowInstance");
        }
        else
        {
            Console.WriteLine("\nInstance Level Events:\n");
    
            foreach (WorkflowTrackingRecord workflowTrackingRecord in
                sqlTrackingWorkflowInstance.WorkflowEvents)
            {
                Console.WriteLine("EventDescription : {0}  DateTime : {1}",
                    workflowTrackingRecord.TrackingWorkflowEvent,
                    workflowTrackingRecord.EventDateTime);
            }
        }
    }
    
    Private Shared Sub GetInstanceTrackingEvents(ByVal instanceId As Guid)
        Dim sqlTrackingQuery As SqlTrackingQuery = _
            New SqlTrackingQuery(connectionString)
    
        Dim sqlTrackingWorkflowInstance As SqlTrackingWorkflowInstance = Nothing
        If sqlTrackingQuery.TryGetWorkflow(instanceId, sqlTrackingWorkflowInstance) = False Then
            Console.WriteLine("Could not retrieve SqlTrackingWorkflowInstance")
        Else
            Console.WriteLine(Constants.vbLf & "Instance Level Events:" & Constants.vbLf)
    
            For Each workflowTrackingRecord As WorkflowTrackingRecord In _
                sqlTrackingWorkflowInstance.WorkflowEvents
                Console.WriteLine("EventDescription : {0}  DateTime : {1}", _
                    workflowTrackingRecord.TrackingWorkflowEvent, _
                    workflowTrackingRecord.EventDateTime)
            Next workflowTrackingRecord
        End If
    End Sub
    
  6. Rufen Sie in der Main-Methode der Program-Klasse nach dem Aufrufen der StopRuntime-Methode die gerade erstellte GetInstanceTrackingEvents-Methode auf, indem Sie die InstanceId-Eigenschaft des workflowInstance-Objekts als Parameter übermitteln.

    GetInstanceTrackingEvents(workflowInstance.InstanceId);
    

So verfolgen Sie Aktivitätsereignisse:

  1. Erstellen Sie in der Program-Klasse des Projekts eine neue statische Methode mit der Bezeichnung GetActivityTrackingEvents, von der ein Guid-Parameter mit der Bezeichnung instanceId akzeptiert wird.

  2. Erstellen Sie in der GetActivityTrackingEvents-Methode ein neues SqlTrackingQuery-Objekt, und übermitteln Sie die connectionString-Variable als Parameter an den Konstruktor.

  3. Erstellen Sie eine SqlTrackingWorkflowInstance-Variable mit der Bezeichnung sqlTrackingWorkflowInstance, und übermitteln Sie dieses Objekt zusammen mit dem instanceId-Parameter an die TryGetWorkflow-Methode, die im SqlTrackingQuery-Objekt definiert ist. Von dieser TryGetWorkflow-Methode wird ein boolescher Wert zurückgegeben, mit dem Erfolg oder Fehlschlagen des Vorgangs angegeben wird. Falls von der Methode false zurückgegeben wird, wird eine Fehlermeldung ausgegeben und von der Methode zurückgegeben.

  4. Blättern Sie durch jeden ActivityTrackingRecord, der in der im sqlTrackingWorkflowInstance-Objekt definierten ActivityEvents-Auflistung enthalten ist.

    Zeigen Sie die ExecutionStatus-Eigenschaft, die EventDateTime-Eigenschaft und die QualifiedName-Eigenschaft des activityTrackingRecord-Objekts mithilfe der WriteLine-Methode an. Die GetActivityTrackingEvents-Methode sollte folgendem Beispiel entsprechend angezeigt werden:

    static void GetActivityTrackingEvents(Guid instanceId)
    {
        SqlTrackingQuery sqlTrackingQuery = new SqlTrackingQuery(connectionString);
    
        SqlTrackingWorkflowInstance sqlTrackingWorkflowInstance;
        if (!sqlTrackingQuery.TryGetWorkflow(instanceId, out sqlTrackingWorkflowInstance))
        {
            Console.WriteLine("Could not retrieve SqlTrackingWorkflowInstance");
        }
        else
        {
            Console.WriteLine("\nActivity Tracking Events:\n");
    
            foreach (ActivityTrackingRecord activityTrackingRecord in
                sqlTrackingWorkflowInstance.ActivityEvents)
            {
                Console.WriteLine(
                    "StatusDescription: {0}  DateTime: {1} Activity Qualified ID: {2}",
                    activityTrackingRecord.ExecutionStatus,
                    activityTrackingRecord.EventDateTime,
                    activityTrackingRecord.QualifiedName);
            }
        }
    }
    
    Private Shared Sub GetActivityTrackingEvents(ByVal instanceId As Guid)
    
        Dim sqlTrackingQuery As SqlTrackingQuery = _
            New SqlTrackingQuery(connectionString)
    
        Dim sqlTrackingWorkflowInstance As SqlTrackingWorkflowInstance = Nothing
        If sqlTrackingQuery.TryGetWorkflow(instanceId, sqlTrackingWorkflowInstance) = False Then
            Console.WriteLine("Could not retrieve SqlTrackingWorkflowInstance")
        Else
            Console.WriteLine(Constants.vbLf & "Activity Tracking Events:" & _
                Constants.vbLf)
    
            For Each activityTrackingRecord As ActivityTrackingRecord In _
                sqlTrackingWorkflowInstance.ActivityEvents
                Console.WriteLine( _
                    "StatusDescription: {0}  DateTime: {1} Activity Qualified ID: {2}", _
                    activityTrackingRecord.ExecutionStatus, _
                    activityTrackingRecord.EventDateTime, _
                    activityTrackingRecord.QualifiedName)
            Next activityTrackingRecord
        End If
    End Sub
    
  5. Rufen Sie in der Main-Methode der Program-Klasse nach dem Aufrufen der StopRuntime-Methode die gerade erstellte GetActivityTrackingEvents-Methode auf, indem Sie die InstanceId-Eigenschaft des workflowInstance-Objekts als Parameter übermitteln.

    GetActivityTrackingEvents(workflowInstance.InstanceId);
    
  6. Erstellen Sie das Projekt, und führen Sie die Anwendung aus.

    Das Ergebnis ähnelt der folgenden Abbildung.

    Ausgabe von Aufgabe 4

Kompilieren des Codes

Informationen zum Kompilieren des Codes finden Sie unter Kompilieren des Codes.

In Aufgabe 5: Erstellen eines Überwachungsprofils erstellen Sie ein benutzerdefiniertes Überwachungsprofil für die CodeActivity-Aktivitäten, mit dem alle Workflow- und Aktivitätsereignisse nachverfolgt werden.

Siehe auch

Aufgaben

Aufgabe 5: Erstellen eines Überwachungsprofils

Referenz

SqlTrackingService
SqlTrackingQuery
SqlTrackingWorkflowInstance
ActivityEvents
ActivityTrackingRecord
WorkflowEvents
WorkflowTrackingRecord
ExecutionStatus

Konzepte

Erstellen von benutzerdefinierten Überwachungsdiensten

Footer image

Copyright © 2007 by Microsoft Corporation. Alle Rechte vorbehalten.