工作 4:使用 Windows 工作流程追蹤服務

在上一個工作中,您讓 SqlWorkflowPersistenceService 服務在工作流程進入閒置狀態時保留該工作流程。

在本工作中,您會使用 SqlTrackingService 服務來追蹤工作流程執行個體以及在工作流程執行時發生的活動事件。 新增 SqlTrackingService 服務,方法是使用在 WorkflowRuntime 中定義的 AddService 方法以使用 SqlTrackingQuery 類別。

在工作流程完成執行後,您可以使用 SqlTrackingQuery 類別從追蹤資料庫擷取追蹤資訊。 在建立 SqlTrackingQuery 類別的執行個體,並傳遞您所使用之追蹤資料庫的連線字串時,您可以透過存取 SqlTrackingWorkflowInstance 物件的 ActivityEvents 屬性來列舉每個追蹤記錄。 這包含 ActivityTrackingRecord 物件的集合,以檢視您工作流程中活動的追蹤資訊。 此外,您可以使用相同的程序透過存取在 SqlTrackingWorkflowInstance 類別中定義的 WorkflowEvents 屬性,來追蹤工作流程執行個體事件。

注意

Windows Workflow Foundation 所安裝的 SQL 服務會使用 Microsoft SQL Server 來儲存資訊。 您可以使用 Microsoft SQL Server 2005 Express、Microsoft SQL Server 2000 (含) 以後版本或 Microsoft SQL Server 2000 Desktop Engine (MSDE) 來執行這些工作。

注意

Windows Workflow Foundation 安裝程式不會安裝這些服務所需的資料庫,但是會安裝 SQL 指令碼來為這些服務建立及設定資料庫。

注意

雖然建議您從頭到尾照著練習做,但是不一定要這樣。 您可以開啟範例專案並繼續下一節中的步驟,開始這個練習。 此外,為了讓專案能正確作業,您必須建立應用程式使用的持續性資料庫。 若要執行這個步驟,請按照工作 3:使用 Windows 工作流程持續性服務中的<建立 SQL 持續性資料庫>程序進行。

若要建立 SQL 追蹤資料庫

  1. 如果您使用 Microsoft SQL Server 2005 Express、Microsoft SQL Server 2000 (含) 以後版本或 Microsoft SQL Server 2000 Desktop Engine (MSDE),請使用下列 SQL 查詢陳述式建立一個名為 WorkflowTrackingStore 的新資料庫:

    CREATE DATABASE WorkflowTrackingStore
    
  2. 在 SQL Query Analyzer 工作區中,從可用資料庫的清單中選取您在步驟 1 建立的資料庫。

  3. 在 [檔案] 功能表上,按一下 [開啟],再開啟 SQL 指令碼 %WINDIR%\Microsoft.NET\Framework\v3.0\Windows Workflow Foundation\SQL\<language>\Tracking_Schema.sql

  4. 按一下 [執行] 或是按 F5 來執行查詢,以建立 SQL 追蹤服務資料表。

  5. 在 [檔案] 功能表上,按一下 [開啟],再開啟 SQL 指令碼 %WINDIR%\Microsoft.NET\Framework\v3.0\Windows Workflow Foundation\SQL\<language>\Tracking_Logic.sql

  6. 按一下 [執行] 或按下 F5 執行查詢,以建立 SQL 追蹤服務預存程序。

若要匯入 SQL 命名空間

  • 將下列指示詞新增至包含 Program 類別的檔案,以匯入使用追蹤和 SqlTrackingQuery 類別必須具備的型別。

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

若要修改 SqlTrackingService 的 App.config

  1. 在 App.config 檔的 Services 項目中,建立名為 add 的新項目。

  2. add 項目中,新增名為 type 的屬性,其值為 System.Workflow.Runtime.Tracking.SqlTrackingService, System.Workflow.Runtime, Version=3.0.00000.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35。

  3. add 項目中,新增名為 connectionString 的屬性,其值為 Initial Catalog=WorkflowTrackingStore;Data Source=localhost;Integrated Security=SSPI;

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

若要追蹤工作流程事件

  1. 在您專案的 Program 類別中,建立 String 型別的新靜態欄位,名為 connectionString

    將 "Initial Catalog=WorkflowTrackingStore;Data Source=localhost;Integrated Security=SSPI;". 值指定給這個欄位。

    public static string connectionString =
        "Initial Catalog=WorkflowTrackingStore;" +
        "Data Source=localhost;Integrated Security=SSPI;";
    
  2. 在您專案的 Program 類別中,建立名為 GetInstanceTrackingEvents 的新靜態方法,它可接受名為 instanceId 的 Guid 參數。

  3. GetInstanceTrackingEvents 方法中,建立新的 SqlTrackingQuery 物件,將 connectionString 變數做為參數傳遞給建構函式。

  4. 建立名為 sqlTrackingWorkflowInstance 的 SqlTrackingWorkflowInstance 變數,並將該物件與 instanceId 參數一起傳遞至 SqlTrackingQuery 物件中定義的 TryGetWorkflow 方法。 TryGetWorkflow 方法會傳回指示成功或失敗的布林值。 如果方法傳回 false,則輸出錯誤訊息並從該方法傳回。

  5. 列舉 sqlTrackingWorkflowInstance 物件中定義之 WorkflowEvents 集合所包含的 WorkflowTrackingRecord

    使用 WriteLine 方法顯示 TrackingWorkflowEventEventDateTime 屬性。 您的 GetInstanceTrackingEvents 看起來會與下列程式碼類似:

    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. Program 類別的 Main 方法中,於 StopRuntime 方法呼叫之後,呼叫您剛剛建立的 GetInstanceTrackingEvents 方法,並將 workflowInstance 物件的 InstanceId 屬性做為參數傳遞。

    GetInstanceTrackingEvents(workflowInstance.InstanceId);
    

若要追蹤活動事件

  1. 在您專案的 Program 類別中,建立名為 GetActivityTrackingEvents 的新靜態方法,它會接受名為 instanceId 的 Guid 參數。

  2. GetActivityTrackingEvents 方法中,建立新的 SqlTrackingQuery 物件,將 connectionString 變數做為參數傳遞給建構函式。

  3. 建立名為 sqlTrackingWorkflowInstance 的 SqlTrackingWorkflowInstance 變數,並將該物件與 instanceId 參數一起傳遞到在 SqlTrackingQuery 物件中定義的 TryGetWorkflow 方法。 TryGetWorkflow 方法會傳回指示成功或失敗的布林值。 如果方法傳回 false,則輸出錯誤訊息並從該方法傳回。

  4. 列舉 sqlTrackingWorkflowInstance 物件中定義之 ActivityEvents 集合所包含的 ActivityTrackingRecord

    使用 WriteLine 方法,顯示 activityTrackingRecord 物件的 ExecutionStatusEventDateTimeQualifiedName 屬性。 您的 GetActivityTrackingEvents 方法看起來會與下列程式碼類似:

    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. Program 類別的 Main 方法中,於 StopRuntime 方法呼叫之後,呼叫您剛剛建立的 GetActivityTrackingEvents 方法,並將 workflowInstance 物件的 InstanceId 屬性做為參數傳遞。

    GetActivityTrackingEvents(workflowInstance.InstanceId);
    
  6. 建置您的專案並執行應用程式。

    您的輸出將與下面類似:

    工作 4 輸出

編譯程式碼

如需編譯您程式碼的詳細資訊,請參閱編譯程式碼

工作 5:建立追蹤設定檔中,您會建立自訂追蹤設定檔,以追蹤 CodeActivity 活動的所有工作流程事件和活動事件。

請參閱

工作

工作 5:建立追蹤設定檔

參考

SqlTrackingService
SqlTrackingQuery
SqlTrackingWorkflowInstance
ActivityEvents
ActivityTrackingRecord
WorkflowEvents
WorkflowTrackingRecord
ExecutionStatus

概念

建立自訂追蹤服務

Footer image

Copyright © 2007 by Microsoft Corporation. All rights reserved.