Freigeben über


Verwenden von SqlTrackingService

Die SqlTrackingService-Klasse stellt einen voll funktionsfähigen Überwachungsdienst dar. Sie können diesen Dienst verwenden, um Überwachungsinformationen zu sammeln und zu speichern. Darüber hinaus können Sie Überwachungsprofile speichern, die Sie bereitstellen, wenn diese vom Workflow-Laufzeitmodul angefordert werden. Der SQL-Überwachungsdienst schreibt von der Laufzeitverfolgungsinfrastruktur an ihn gesendete Verfolgungsdaten in eine SQL-Datenbank.

In vielen Fällen ist es wichtig, dass die vom SqlTrackingService-Dienst verwendete Datenbank und der Zustand des Workflow-Laufzeitmoduls konsistent bleiben. Aus diesem Grund implementiert die SqlTrackingService-Klasse die IPendingWork-Schnittstelle und kann die Funktion für Workflow-Transaktionsbatchverarbeitung verwenden, die vom WorkflowCommitWorkBatchService-Dienst bereitgestellt wird. Sie können die IsTransactional-Eigenschaft festlegen oder die entsprechenden Parameter dem Konstruktor übergeben, um den SqlTrackingService-Dienst für die Verwendung der Batchverarbeitung zu konfigurieren und dem Arbeitsbatch Objekte hinzuzufügen, die ausstehende Änderungen der SQL-Datenbank darstellen.

Der SqlTrackingService-Dienst speichert auch Überwachungsprofile in seiner Datenbank. Das Workflow-Laufzeitmodul ist über die Änderungen an von ihm verwendeten Überwachungsprofilen informiert. Der SqlTrackingService-Dienst implementiert die IProfileNotification-Schnittstelle und überprüft regelmäßig die Überwachungsprofile in der Datenbank, um das Workflow-Laufzeitmodul hinsichtlich der Änderungen an einem in der Datenbank gespeicherten TrackingProfile zu benachrichtigen. Sie können die ProfileChangeCheckInterval-Eigenschaft festlegen oder den entsprechenden Parameter dem Konstruktor übergeben, um das Intervall für die Prüfung der Überwachungsprofile durch den SqlTrackingService-Dienst festzulegen.

Hinweis

SqlTrackingService speichert die Hostinformationen nicht in der Überwachungsdatenbank. In einem Szenario mit mehreren Hosts können Hostinformationen mit diesem Dienst nicht abgerufen werden. Dazu muss ein benutzerdefinierter Dienst implementiert werden, der alle relevanten Hostinformationen wie die Host-GUID oder den Hostnamen speichert.

Hinweis

Wenn Sie SqlTrackingService und SqlWorkflowPersistenceService in einer Workflowanwendung verwenden, empfiehlt sich die Verwendung einer einzigen Datenbank für Persistenz und Verfolgung.

Erstellen der SQL-Überwachungsdatenbank

Beim Setup von Windows Workflow Foundation werden nicht die für den SqlTrackingService-Dienst erforderlichen Datenbanken installiert; allerdings installiert das Setup die SQL-Skripte für das Erstellen und Konfigurieren der Datenbanken für diesen Dienst. In diesem Abschnitt finden Sie eine genaue Beschreibung der Schritte für die ordnungsgemäße Konfiguration der vom SqlTrackingService-Dienst verwendeten SQL Server-Datenbank.

Hinweis

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

So erstellen Sie die SQL-Überwachungsdatenbank

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

    CREATE DATABASE WorkflowTrackingStore
    

Hinweis

Wenn Sie SqlTrackingService und SqlWorkflowPersistenceService in einer Workflowanwendung verwenden, empfiehlt sich die Verwendung einer einzigen Datenbank für Persistenz und Verfolgung.

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

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

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

  4. Klicken Sie im Menü Datei auf Öffnen, und öffnen Sie anschließend das SQL-Skript %WINDIR%\Microsoft.NET\Framework\v3.0\Windows Workflow Foundation\SQL\<Sprache>\SqlTracking_Logic.

  5. 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.

Hinzufügen von SqlTrackingService zum Laufzeitmodul

Laufzeitdienste können dem Windows Workflow Foundation-Laufzeitmodul programmgesteuert oder mithilfe einer Anwendungskonfigurationsdatei hinzugefügt werden.

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 dem add-Element, das über den Wert System.Workflow.Runtime.Tracking.SqlTrackingService, System.Workflow.Runtime, Version=3.0.00000.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 verfügt, ein Attribut mit der Bezeichnung type hinzu.

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

Hinweis

Unter Umständen muss abhängig von der Konfiguration von SQL Server die Verbindungszeichenfolge geändert werden. Die hier angezeigte Verbindungszeichenfolge nimmt an, dass der Name der Datenbank WorkflowTrackingStore lautet und dass SQL Server auf demselben System installiert ist, das für Anwendungsentwicklung verwendet wird.

  1. <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;"/>

Programmgesteuertes Hinzufügen von SqlTrackingService zum Laufzeitmodul

  • Rufen Sie die in der WorkflowRuntime-Klasse definierte AddService-Methode auf, und übergeben Sie eine neue Instanz von SqlTrackingService.

    Im folgenden Beispiel wird gezeigt, wie SqlTrackingService mithilfe derselben Konfiguration wie im zuvor gezeigten Beispiel erstellt wird.

    [C#]

    using (WorkflowRuntime workflowRuntime = new WorkflowRuntime())
    {
        // Create the SqlTrackingService.
        string connectionString ="Initial Catalog=WorkflowTrackingStore;Data Source=localhost;Integrated Security=SSPI;";
        SqlTrackingService trackService = new SqlTrackingService(connectionString);
    
        // Add the SqlTrckingService to the runtime engine
        workflowRuntime.AddService( trackService );
    
        // ...
    }
    

Zuweisen von TrackingProfile zu Workflowtypen

Nachdem Sie den SqlTrackingService-Dienst dem Laufzeitmodul hinzugefügt haben, kann er sofort verwendet werden. Ist kein Überwachungsprofil angegeben, verwendet der SqlTrackingService-Dienst ein Standardprofil, falls die UseDefaultProfile-Eigenschaft true ist. In dieser Instanz werden bei Verwendung eines Standardprofils die Überwachungsinformationen für jedes Workflow- und jedes Aktivitätsereignis gespeichert. Zum Steuern der verfolgten Informationen wird die Definition eines TrackingProfile empfohlen, das mit SqlTrackingService verwendet wird. Lautet der Wert für die UseDefaultProfile-Eigenschaft jedoch false, verwendet SqlTrackingService nicht das Standardüberwachungsprofil, sofern dem startenden Workflowtyp kein Profil zugewiesen ist.

Die gespeicherten SQL-Prozeduren, die von Windows Workflow Foundation bereitgestellt werden, beinhalten eine Prozedur mit der Bezeichnung UpdateTrackingProfile. Mit dieser Prozedur erfolgt die Übergabe des Typnamens des zu überwachenden Workflows, der Assembly, in der der Workflow definiert ist, einer Versionszeichenfolge für die Überwachungsprofilversion und des in XML serialisierten Überwachungsprofils.

Im folgenden Beispiel wird veranschaulicht, wie ein TrackingProfile-Objekt programmgesteuert erstellt wird. In diesem Beispiel kann das erstellte TrackingProfile-Objekt dazu verwendet werden, nur in einem Workflow definierte CodeActivity-Aktivitäten zu überwachen.

static void CreateTrackingProfile()
{
    TrackingProfile profile = new TrackingProfile();
    ActivityTrackPoint trackPoint = new ActivityTrackPoint();

    // Track CodeActivity activities only.
    ActivityTrackingLocation location = new ActivityTrackingLocation
        (typeof(System.Workflow.Activities.CodeActivity));

    // Add all activity tracking events.
    foreach (ActivityExecutionStatus s in 
        Enum.GetValues(typeof(ActivityExecutionStatus)))
    {
        location.ExecutionStatusEvents.Add(s);
    }

    trackPoint.MatchingLocations.Add(location);
    profile.ActivityTrackPoints.Add(trackPoint);
    profile.Version = new Version("1.0.0.0");

    WorkflowTrackPoint wtp = new WorkflowTrackPoint();
    WorkflowTrackingLocation wtl = new WorkflowTrackingLocation();

    // Add all workflow tracking events.
    foreach (TrackingWorkflowEvent s in 
        Enum.GetValues(typeof(TrackingWorkflowEvent)))
    {
        wtl.Events.Add(s);
    }

    wtp.MatchingLocation = wtl;
    profile.WorkflowTrackPoints.Add(wtp);

    // Serialize tracking profile and save to SQL.
    TrackingProfileSerializer serializer = new TrackingProfileSerializer();
    StringWriter writer = new StringWriter(new StringBuilder(), 
        CultureInfo.InvariantCulture);
    serializer.Serialize(writer, profile);
    InsertTrackingProfile(writer.ToString());
}

In der letzten Zeile dieses Codebeispiels wird eine Methode mit dem Namen InsertTrackingProfile aufgerufen. Diese Methode, die im nächsten Beispiel definiert ist, verwendet die gespeicherte UpdateTrackingProfile-Prozedur, um die Überwachungsdatenbank mit einem neuen TrackingProfile zu aktualisieren.

static void InsertTrackingProfile(string profile)
{
    SqlCommand cmd = new SqlCommand();

    cmd.CommandType = CommandType.StoredProcedure;
    cmd.CommandText = "dbo.UpdateTrackingProfile";
    cmd.Connection = new SqlConnection(Program.connectionString);
    try
    {
        cmd.Parameters.Clear();

        SqlParameter typFullName = new SqlParameter();
        typFullName.ParameterName = "@TypeFullName";
        typFullName.SqlDbType = SqlDbType.NVarChar;
        typFullName.SqlValue = typeof(SimpleWorkflow).ToString();
        cmd.Parameters.Add(typFullName);

        SqlParameter assemblyFullName = new SqlParameter();
        assemblyFullName.ParameterName = "@AssemblyFullName";
        assemblyFullName.SqlDbType = SqlDbType.NVarChar;
        assemblyFullName.SqlValue = typeof(SimpleWorkflow).Assembly.FullName;
        cmd.Parameters.Add(assemblyFullName);

        SqlParameter versionId = new SqlParameter();
        versionId.ParameterName = "@Version";
        versionId.SqlDbType = SqlDbType.VarChar;

        // The version ID must match the tracking profile version 
        // number.
        versionId.SqlValue = "1.0.0.0";

        cmd.Parameters.Add(versionId);

        SqlParameter trackingProfile = new SqlParameter();
        trackingProfile.ParameterName = "@TrackingProfileXml";
        trackingProfile.SqlDbType = SqlDbType.NVarChar;
        trackingProfile.SqlValue = profile;
        cmd.Parameters.Add(trackingProfile);

        cmd.Connection.Open();
        cmd.ExecuteNonQuery();
    }
    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;
    }
    finally
    {
        if ((null != cmd) && (null != cmd.Connection) && 
            (ConnectionState.Closed != cmd.Connection.State))
            cmd.Connection.Close();
    }
}

Der Prozess für das Definieren eines hier gezeigten TrackingProfile sollte vor dem Erstellen und Starten des überwachten Workflowtyps aufgerufen werden. Beim Start des Workflows stellt SqlTrackingService fest, dass TrackingProfile zu verwenden ist und verarbeitet die Überwachungsinformationen dementsprechend.

Hinweis

Die Versionsnummer eines Überwachungsprofil muss aktualisiert werden, falls der dem Überwachungsprofil zugewiesene Workflowtyp geändert wird, da der Überwachungsdienst die Überwachungsdaten andernfalls nicht dem vorherigen Workflowtyp zuordnen kann.

Weitere Informationen zum Extrahieren von Überwachungsinformationen aus der Überwachungsdatenbank finden Sie unter Abfragen von SqlTrackingService-Daten mit SqlTrackingQuery. Weitere Informationen zu Datenpflegefeatures in Windows Workflow Foundation, die die Organisation von Überwachungsdaten in der SqlTrackingService-Datenbank vereinfachen, finden Sie unter Datenpflege mit SqlTrackingService.

Siehe auch

Referenz

SqlTrackingService
TrackingProfile

Konzepte

Abfragen von SqlTrackingService-Daten mit SqlTrackingQuery
Datenpflege mit SqlTrackingService
Windows Workflow-Überwachungsdienste

Weitere Ressourcen

Simple Tracking Sample
Tracking Using User Track Points Sample
Using the Tracking Profile Object Model Sample
Workflow Tracking Service Database Schema

Footer image

Copyright © 2007 by Microsoft Corporation. Alle Rechte vorbehalten.