共用方式為


使用 SqlTrackingService

SqlTrackingService 類別代表功能完整的追蹤服務。您可以使用這個服務收集和儲存追蹤資訊和儲存追蹤設定檔,並在工作流程執行階段引擎要求時提供它們。SQL 追蹤服務會將執行階段追蹤基礎結構傳送給它的追蹤資料寫入 SQL 資料庫中。

在許多案例中,對 SqlTrackingService 服務而言,保持它的資料庫與工作流程執行階段引擎的狀態之間的一致性相當重要。因此,SqlTrackingService 類別會實作 IPendingWork 介面,以便參與 WorkflowCommitWorkBatchService 服務所提供的工作流程交易批次處理功能。您可以設定 IsTransactional 屬性或將適當的參數傳遞至建構函式,以設定 SqlTrackingService 服務參與批次處理,並將表示對 SQL 資料庫的暫止變更的物件加入至工作批次。

SqlTrackingService 服務也會在其資料庫中保存追蹤設定檔。工作流程執行階段引擎知道它目前所使用任何追蹤設定檔的變更。SqlTrackingService 服務會實作 IProfileNotification 介面,並定期在它的資料庫中檢查追蹤設定檔,以通知工作流程執行階段引擎有關這些 TrackingProfile 的變更。您可以設定 ProfileChangeCheckInterval 屬性,或將適當的參數傳遞至建構函式,以設定 SqlTrackingService 服務檢查其追蹤設定檔的時間間隔。

注意

SqlTrackingService 並未將主機資訊存放在追蹤資料庫中。在多主機案例中,您無法使用這個服務來擷取主機資訊。若要這麼做,您必須實作自訂追蹤服務,此服務會儲存如主機 GUID 或主機名稱等任何相關的主機資訊。

注意

在工作流程應用程式中使用 SqlTrackingServiceSqlWorkflowPersistenceService 時,建議您使用單一資料庫進行保存和追蹤。

建立 SQL 追蹤資料庫

Windows Workflow Foundation 安裝程式不會安裝 SqlTrackingService 服務所需的資料庫,但是會安裝 SQL 指令碼來為這個服務建立及設定資料庫。本章節將詳細說明正確設定 SqlTrackingService 服務所使用 SQL Server 資料庫必須採取的步驟。

注意

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

若要建立 SQL 追蹤資料庫

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

    CREATE DATABASE WorkflowTrackingStore
    

注意

在工作流程應用程式中使用 SqlTrackingServiceSqlWorkflowPersistenceService 時,建議您使用單一資料庫進行保存和追蹤。

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

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

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

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

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

將 SqlTrackingService 加入至執行階段引擎

您可以用程式設計的方式或使用應用程式組態檔,將執行階段服務加入至 Windows Workflow Foundation 執行階段引擎。

若要修改 SqlTrackingService 的 App.config

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

  2. 將名為 type 的屬性加入至值為 System.Workflow.Runtime.Tracking.SqlTrackingService, System.Workflow.Runtime, Version=3.0.00000.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35 的 add 項目。

  3. 將名為 connectionString 的屬性加入至值為 =Initial Catalog=WorkflowTrackingStore;Data Source=localhost;Integrated Security=SSPI; 的 add 項目。

注意

您必須根據您 SQL Server 的組態修改連線字串。這裡顯示的連線字串假設資料庫名稱為 WorkflowTrackingStore,並且 SQL Server 安裝在與您開發應用程式時所使用的相同系統上。

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

以程式設計方式將 SqlTrackingService 加入至執行階段引擎

  • 呼叫在 WorkflowRuntime 類別中定義的 AddService 方法,傳遞 SqlTrackingService 的新執行個體。

    下列範例會示範如何使用與先前程序所示範例相同的組態來建立 SqlTrackingService

    [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 );
    
        // ...
    }
    

將 TrackingProfile 與工作流程類型產生關聯

SqlTrackingService 服務加入至執行階段引擎之後,就可以立即使用它。當未指定追蹤設定檔時,如果 UseDefaultProfile 屬性為 true,則 SqlTrackingService 服務會使用預設設定檔。在這個例子中,當您使用預設設定檔時,會儲存每個工作流程和活動事件的追蹤資訊。然而,為了控制追蹤的資訊,您應該定義 TrackingProfileSqlTrackingService 搭配使用。但是當 UseDefaultProfile 屬性為 false 時,如果沒有任何追蹤設定檔與啟動的工作流程類型相關聯,則 SqlTrackingService 不會使用預設追蹤設定檔。

Windows Workflow Foundation 所提供的 SQL 預存程序包含名為 UpdateTrackingProfile 的程序。這個程序可讓您傳遞要追蹤之工作流程的類型名稱、已定義工作流程的組件、追蹤設定檔版本的版本字串,以及序列化為 XML 的追蹤設定檔。

下列範例會示範如何以程式設計方式建立 TrackingProfile 物件。在這個範例中,所建立的 TrackingProfile 物件可以只用來追蹤在工作流程中定義的 CodeActivity 活動。

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());
}

在這個程式碼範例的最後一行中,會呼叫名為 InsertTrackingProfile 的方法。這個方法 (將在下一個範例中定義) 會使用 UpdateTrackingProfile 預存程序搭配新的 TrackingProfile 來更新追蹤資料庫。

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();
    }
}

在建立和啟動追蹤的工作流程類型之前,應該先呼叫這裡所示的定義 TrackingProfile 程序。當您的工作流程啟動時,SqlTrackingService 會偵測到應該使用 TrackingProfile,然後隨同處理追蹤資訊。

注意

如果與追蹤設定檔相關聯的工作流程類型有所變更,請務必更新追蹤設定檔的版本號碼,否則追蹤服務便無法將追蹤資料與先前的工作流程類型產生關聯。

如需如何從追蹤資料庫擷取追蹤資訊的詳細資訊,請參閱使用 SqlTrackingQuery 查詢 SqlTrackingService 資料。如需 Windows Workflow Foundation 中專為協助組織追蹤 SqlTrackingService 資料庫資料而設計之資料維護功能的詳細資訊,請參閱使用 SqlTrackingService 進行資料維護

請參閱

參考

SqlTrackingService
TrackingProfile

概念

使用 SqlTrackingQuery 查詢 SqlTrackingService 資料
使用 SqlTrackingService 進行資料維護
Windows 工作流程追蹤服務

其他資源

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. All rights reserved.