Freigeben über


Aufgabe 5: Erstellen eines Überwachungsprofils

Mit Überwachungsprofilen wird der Überwachungsinformationstyp gesteuert, der vom Laufzeitmodul von Windows Workflow Foundation erzeugt wird. Standardmäßig werden bei Verwendung eines Standardprofils die Überwachungsinformationen für jedes Workflow- und jedes Aktivitätsereignis gespeichert.

In dieser Aufgabe wird ein benutzerdefiniertes Überwachungsprofil erstellt, mit dem alle Workflow- und Aktivitätsereignisse überwacht werden. Dies gilt jedoch nur für die CodeActivity-Aktivitäten. Bei allen anderen Aktivitäten im Workflow werden bei Verwendung dieses Profils keine Überwachungsinformationen generiert.

Hinweis

Sie werden aufgefordert, die Übungen der Reihe nach auszuführen. Dies ist jedoch nicht erforderlich. Sie können durch Öffnen des Beispielprojekts mit dieser Übung beginnen und mit den Schritten im folgenden Abschnitt fortfahren.

So importieren Sie die Namespaces:

  • Fügen Sie in der Program-Quelldatei die folgenden Direktiven hinzu, um die für Überwachungsprofile erforderlichen Typen zu importieren.

    using System.IO;
    using System.Globalization;
    using System.Workflow.ComponentModel;
    using System.Workflow.Activities;
    

So erstellen Sie das Überwachungsprofil:

  1. Erstellen Sie in der Program-Klasse des Projekts eine statische Methode mit dem Namen CreateTrackingProfile.

    Private Shared Sub CreateTrackingProfile()
    End Sub
    
    static void CreateTrackingProfile()
    {
    }
    
  2. Erstellen Sie in der in Schritt 1 erstellten CreateTrackingProfile-Methode ein TrackingProfile-Objekt mit der Bezeichnung profile und ein ActivityTrackPoint-Objekt mit der Bezeichnung trackPoint. Legen Sie zudem die Version-Eigenschaft des TrackingProfile-Objekts einer neuen Instanz eines Version-Objekts entsprechend fest, und übergeben Sie dem Konstruktor die Zeichenfolge "1.0.0.0" als Parameter.

    TrackingProfile profile = new TrackingProfile();
    ActivityTrackPoint trackPoint = new ActivityTrackPoint();
    profile.Version = new Version("1.0.0.0");
    
  3. Erstellen Sie ein ActivityTrackingLocation-Objekt mit der Bezeichnung location, und übergeben Sie dem Konstruktor den Type der CodeActivity-Aktivität als Parameter.

    // track CodeActivity activities only
    ActivityTrackingLocation location = new ActivityTrackingLocation
        (typeof(CodeActivity));
    
  4. Durchlaufen Sie die Werte im aufgelisteten ActivityExecutionStatus-Datentyp, und fügen Sie diese Werte der im ActivityTrackingLocation-Objekt definierten ExecutionStatusEvents-Auflistung hinzu.

    // add all activity tracking events
    foreach (ActivityExecutionStatus s in
        Enum.GetValues(typeof(ActivityExecutionStatus)))
    {
        location.ExecutionStatusEvents.Add(s);
    }
    
  5. Fügen Sie das ActivityTrackingLocation-Objekt der MatchingLocations-Auflistung hinzu, die im ActivityTrackPoint-Objekt definiert ist.

  6. Fügen Sie das ActivityTrackPoint-Objekt der ActivityTrackPoints-Auflistung hinzu, die im TrackingProfile-Objekt definiert ist.

    trackPoint.MatchingLocations.Add(location);
    profile.ActivityTrackPoints.Add(trackPoint);
    
  7. Erstellen Sie ein neues WorkflowTrackPoint-Objekt mit der Bezeichnung wtp und ein WorkflowTrackingLocation-Objekt mit der Bezeichnung wtl.

    WorkflowTrackPoint wtp = new WorkflowTrackPoint();
    WorkflowTrackingLocation wtl = new WorkflowTrackingLocation();
    
  8. Durchlaufen Sie den aufgelisteten TrackingWorkflowEvent-Datentyp, und fügen Sie jeden Wert der im WorkflowTrackingLocation-Objekt definierten Events-Auflistung hinzu.

    // add all workflow tracking events
    foreach (TrackingWorkflowEvent s in
        Enum.GetValues(typeof(TrackingWorkflowEvent)))
    {
        wtl.Events.Add(s);
    }
    
  9. Legen Sie die im WorkflowTrackPoint-Objekt definierte MatchingLocation-Eigenschaft auf das WorkflowTrackingLocation-Objekt fest.

  10. Fügen Sie das WorkflowTrackPoint-Objekt der WorkflowTrackPoints-Auflistung hinzu, die im TrackingProfile-Objekt definiert ist.

    wtp.MatchingLocation = wtl;
    profile.WorkflowTrackPoints.Add(wtp);
    
  11. Erstellen Sie ein neues TrackingProfileSerializer-Objekt mit der Bezeichnung serializer und ein StringWriter-Objekt mit der Bezeichnung writer.

    // serialize tracking profile and save to SQL
    TrackingProfileSerializer serializer = new TrackingProfileSerializer();
    StringWriter writer = new StringWriter(new StringBuilder(),
        CultureInfo.InvariantCulture);
    
  12. Serialisieren Sie das TrackingProfile-Objekt durch Aufrufen der Serialize-Methode, die in der TrackingProfileSerializer-Klasse definiert ist.

    Übergeben Sie dieser Methode die StringWriter und TrackingProfile-Objekte als Parameter.

    serializer.Serialize(writer, profile);
    
  13. Rufen Sie die InsertTrackingProfile-Methode auf, und übergeben Sie der Methode writer.ToString() als Parameter.

    Hinweis

    Die InsertTrackingProfile-Methode wird in der nächsten Prozedur erstellt.

    InsertTrackingProfile(writer.ToString());
    
  14. Rufen Sie in der Main-Methode der Program-Klasse die soeben erstellte CreateTrackingProfile-Methode auf. Diese Methode sollte vor dem Erstellen des WorkflowRuntime-Objekts aufgerufen werden.

    CreateTrackingProfile();
    

So speichern Sie das Überwachungsprofil in eine SQL-Datenbank:

  1. Erstellen Sie in der Program-Klasse des Projekts eine neue statische Methode mit der Bezeichnung InsertTrackingProfile, die einen String mit der Bezeichnung profile als Parameter verwendet.

    Private Shared Sub InsertTrackingProfile(ByVal profile As String)
    End Sub
    
    static void InsertTrackingProfile(string profile)
    {
    }
    
  2. Erstellen Sie in der InsertTrackingProfile-Methode ein neues SqlCommand-Objekt mit der Bezeichnung cmd.

    SqlCommand cmd = new SqlCommand();
    
  3. Legen Sie mithilfe des im vorherigen Schritt erstellten SqlCommand-Objekts die CommandType-Eigenschaft auf CommandType.StoredProcedure und die CommandText-Eigenschaft auf "dbo.UpdateTrackingProfile" fest.

  4. Erstellen Sie ein neues SqlConnection-Objekt, und übergeben Sie dabei dem Konstruktor Program.connectionString als Parameter, und weisen Sie dieses Objekt anschließend der Connection-Eigenschaft zu, die im SqlCommand-Objekt definiert ist.

    cmd.CommandType = CommandType.StoredProcedure;
    cmd.CommandText = "dbo.UpdateTrackingProfile";
    cmd.Connection = new SqlConnection(Program.connectionString);
    
  5. Erstellen Sie einen neuen try-Block, und nehmen Sie den Code für die Schritte 6 bis 15 in diesen Block auf.

  6. Erstellen Sie ein neues SqlParameter-Objekt mit der Bezeichnung typFullName, und legen Sie die Eigenschaften gemäß der Darstellung in der folgenden Tabelle fest.

    Eigenschaftenname Eigenschaftswert

    ParameterName

    "@TypeFullName"

    SqlDbType

    SqlDbType.NVarChar

    SqlValue

    typeof(Microsoft.Samples.Workflow.Tutorials.Hosting.HostingWorkflows).ToString();

  7. Fügen Sie das SqlParameter-Objekt der Parameters-Auflistung hinzu, die im SqlCommand-Objekt definiert ist.

    Der Code für das typFullName-Objekt ähnelt dem folgenden Code.

    SqlParameter typFullName = new SqlParameter();
    typFullName.ParameterName = "@TypeFullName";
    typFullName.SqlDbType = SqlDbType.NVarChar;
    typFullName.SqlValue = typeof(HostingWorkflows).ToString();
    cmd.Parameters.Add(typFullName);
    
  8. Erstellen Sie ein neues SqlParameter-Objekt mit der Bezeichnung assemblyFullName, und legen Sie die Eigenschaften gemäß der Darstellung in der folgenden Tabelle fest.

    Eigenschaftenname Eigenschaftswert

    ParameterName

    "@AssemblyFullName"

    SqlDbType

    SqlDbType.NVarChar

    SqlValue

    typeof(Microsoft.Samples.Workflow.Tutorials.Hosting.HostingWorkflows).Assembly.FullName

  9. Fügen Sie das SqlParameter-Objekt der Parameters-Auflistung hinzu, die im SqlCommand-Objekt definiert ist.

    Der Code für das assemblyFullName-Objekt ähnelt dem folgenden Code.

    SqlParameter assemblyFullName = new SqlParameter();
    assemblyFullName.ParameterName = "@AssemblyFullName";
    assemblyFullName.SqlDbType = SqlDbType.NVarChar;
    assemblyFullName.SqlValue = typeof(HostingWorkflows).Assembly.FullName;
    cmd.Parameters.Add(assemblyFullName);
    
  10. Erstellen Sie ein neues SqlParameter-Objekt mit der Bezeichnung versionId, und legen Sie die Eigenschaften gemäß der Darstellung in der folgenden Tabelle fest.

    Eigenschaftenname Eigenschaftswert

    ParameterName

    "@Version"

    SqlDbType

    SqlDbType.VarChar

    SqlValue

    "1.0.0.0"

  11. Fügen Sie das SqlParameter-Objekt der Parameters-Auflistung hinzu, die im SqlCommand-Objekt definiert ist.

    Der Code für das versionId-Objekt ähnelt dem folgenden Code.

    SqlParameter versionId = new SqlParameter();
    versionId.ParameterName = "@Version";
    versionId.SqlDbType = SqlDbType.VarChar;
    versionId.SqlValue = "1.0.0.0";
    cmd.Parameters.Add(versionId);
    
  12. Erstellen Sie ein neues SqlParameter-Objekt mit der Bezeichnung trackingProfile, und legen Sie die Eigenschaften gemäß der Darstellung in der folgenden Tabelle fest.

    Eigenschaftenname Eigenschaftswert

    ParameterName

    "@TrackingProfileXml"

    SqlDbType

    SqlDbType.NVarChar

    SqlValue

    profile

  13. Fügen Sie SqlParameter der Parameters-Auflistung hinzu, die im SqlCommand-Objekt definiert ist.

    Der Code für das trackingProfile-Objekt entspricht in etwa dem folgenden Code.

    SqlParameter trackingProfile = new SqlParameter();
    trackingProfile.ParameterName = "@TrackingProfileXml";
    trackingProfile.SqlDbType = SqlDbType.NVarChar;
    trackingProfile.SqlValue = profile;
    cmd.Parameters.Add(trackingProfile);
    
  14. Rufen Sie die Open-Methode auf, die in der Connection-Eigenschaft des SqlCommand-Objekts definiert ist.

  15. Rufen Sie die ExecuteNonQuery-Methode auf, die im SqlCommand-Objekt definiert ist, um die gespeicherte Prozedur auszuführen und das Überwachungsprofil zu speichern.

    cmd.Connection.Open();
    cmd.ExecuteNonQuery();
    
  16. Erstellen Sie einen neuen catch-Block für die SqlException-Ausnahme, die dem in den Schritten 5 bis 15 erstellten try-Block folgt.

  17. Verwenden Sie im catch-Block die WriteLine-Methode, um die Message-Eigenschaft anzuzeigen, die im SqlException-Objekt definiert ist.

    Fügen Sie zudem eine Nachricht mit einer Erläuterung der Schritte hinzu, mit denen das Überwachungsprofil bei einer Änderung mit einer neuen Versionsnummer aktualisiert wird.

    catch (SqlException e)
    {
        Console.WriteLine(e.Message);
        Console.WriteLine("The Tracking Profile was not inserted. " +
            "if you want to add a new Tracking Profile, modify the version " +
            "string in the profile by specifying a higher version number.");
        return;
    }
    
  18. Erstellen Sie einen finally-Block, und rufen Sie die Close-Methode und anschließend die Dispose-Methode auf, die in der Connection-Eigenschaft des SqlCommand-Objekts definiert sind.

    finally
    {
        if ((null != cmd) && (null != cmd.Connection) &&
            (ConnectionState.Closed != cmd.Connection.State))
        {
            cmd.Connection.Close();
            cmd.Connection.Dispose();
        }
    }
    
  19. Erstellen Sie das Projekt, und führen Sie es aus.

    Das Ergebnis entspricht in etwa der folgenden Abbildung.

    Ausgabe nach dem Beenden von Aufgabe 5

Kompilieren des Codes

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

Ein vollständiges Lernprogramm finden Sie unter Abgeschlossenes Lernprogramm zum Hosten der Laufzeit von Windows Workflow Foundation.

Siehe auch

Referenz

System.Workflow.Runtime.Tracking
TrackingProfile
ActivityTrackPoint
ActivityExecutionStatus
ActivityTrackingLocation
WorkflowTrackPoint
WorkflowTrackingLocation
TrackingProfileSerializer

Konzepte

Erstellen von benutzerdefinierten Überwachungsdiensten
Erstellen und Verwenden von Überwachungsprofilen

Weitere Ressourcen

Simple Tracking Example
Query Using SQLTrackingService
Tracking Using User Track Points
EventArgs Tracking Sample
ConsoleTrackingService Sample

Footer image

Copyright © 2007 by Microsoft Corporation. Alle Rechte vorbehalten.