共用方式為


設定工作流程的追蹤

本主題僅適用於 Windows Workflow Foundation 4。

工作流程可透過三種方法執行:

視工作流程裝載選項而定,追蹤參與者可以透過程式碼或組態檔加入。本主題描述如何透過將追蹤參與者加入至 WorkflowApplicationWorkflowServiceHost 來設定追蹤,以及如何在使用 WorkflowInvoker 時啟用追蹤。

設定工作流程應用程式追蹤

工作流程可透過 WorkflowApplication 類別來執行。本主題示範如何將追蹤參與者加入至 WorkflowApplication 工作流程主機,以設定 .NET Framework 版本 4 工作流程應用程式的追蹤。在這種情況下,工作流程會以工作流程應用程式的形式執行。您要透過程式碼 (而不是使用組態檔) 設定工作流程應用程式,而該程式碼為使用 WorkflowApplication 類別的自我裝載 .exe 檔案。追蹤參與者會加入做為 WorkflowApplication 執行個體的延伸。將 TrackingParticipant 加入至 WorkflowApplication 執行個體的擴充集合,即可完成此步驟。

若為工作流程應用程式,您可以加入 EtwTrackingParticipant 行為擴充,如下列程式碼所示。

LogActivity activity = new LogActivity();

WorkflowApplication instance = new WorkflowApplication(activity);
EtwTrackingParticipant trackingParticipant =
    new EtwTrackingParticipant
{


        TrackingProfile = new TrackingProfile
           {
               Name = "SampleTrackingProfile",
               ActivityDefinitionId = "ProcessOrder",
               Queries = new WorkflowInstanceQuery
               {
                  States = { "*" }
              }
          }
       };
instance.Extensions.Add(trackingParticipant);

設定工作流程服務追蹤

工作流程裝載於 WorkflowServiceHost 服務主機中時,可以公開為 WCF 服務。對於以工作流程為主的服務而言,WorkflowServiceHost 是特殊的 .NET ServiceHost 實作。本節說明如何為在 WorkflowServiceHost 中執行的 .NET Framework 4 工作流程服務設定追蹤。此追蹤是透過 Web.config 檔案 (適用於 Web 裝載服務) 或 App.config 檔案 (適用於裝載於獨立應用程式中的服務,例如主控台應用程式) 指定服務行為而設定的,或是透過程式碼將追蹤特定行為加入至服務主機的 Behaviors 集合而設定的。

對於裝載於 WorkflowServiceHost 的主機,您可以使用組態檔中的 <behavior> 項目加入 EtwTrackingParticipant,如下列範例所示。

<behaviors>
   <serviceBehaviors>
        <behavior>
          <etwTracking profileName="Sample Tracking Profile" />
        </behavior>            
   </serviceBehaviors>
<behaviors>

此外,對於裝載於 WorkflowServiceHost 中的工作流程服務,您可以透過程式碼加入 EtwTrackingParticipant 行為擴充。若要加入自訂的追蹤參與者,請建立一個新的行為擴充,並將它加入至 ServiceHost,如下列範例程式碼所示。

Ee517415.note(zh-tw,VS.100).gif注意:
如果您要檢視示範如何建立加入追蹤參與者之自訂行為項目的範例程式碼,請參閱 追蹤範例。

ServiceHost svcHost = new ServiceHost(typeof(WorkflowService), new 
                                 Uri("https://localhost:8001/Sample"));
EtwTrackingBehavior trackingBehavior = 
    new EtwTrackingBehavior
    {
        ProfileName = "Sample Tracking Profile"
    };
svcHost.Description.Behaviors.Add(trackingBehavior);
svcHost.Open();

追蹤參與者會做為行為的擴充,而加入至工作流程服務主機。

下列範例程式碼示範如何從組態檔讀取追蹤設定檔。

TrackingProfile GetProfile(string profileName, string displayName)
        {
            TrackingProfile trackingProfile = null;
            TrackingSection trackingSection = (TrackingSection)WebConfigurationManager.GetSection("system.serviceModel/tracking");
            if (trackingSection == null) 
            {
                return null;
            }

            if (profileName == null) 
            {
                profileName = "";
            }

            //Find the profile with the specified profile name in the list of profile found in config
            var match = from p in new List<TrackingProfile>(trackingSection.TrackingProfiles)
                        where (p.Name == profileName) && ((p.ActivityDefinitionId == displayName) || (p.ActivityDefinitionId == "*"))
                        select p;

            if (match.Count() == 0)
            {
                //return an empty profile
                trackingProfile = new TrackingProfile()
                {
                    ActivityDefinitionId = displayName
                };

            }
            else
            {
                trackingProfile = match.First();
            }

            return trackingProfile;

下列範例程式碼示範如何將追蹤設定檔加入至工作流程主機。

WorkflowServiceHost workflowServiceHost = serviceHostBase as WorkflowServiceHost;
if (null != workflowServiceHost)
{
              string workflowDisplayName = workflowServiceHost.Activity.DisplayName;
               TrackingProfile trackingProfile = GetProfile(this.profileName, workflowDisplayName);
                workflowServiceHost.WorkflowExtensions.Add(()  => new EtwTrackingParticipant  {
               TrackingProfile = trackingProfile
                        });
 }

使用 WorkflowInvoker 設定追蹤

若要為使用 WorkflowInvoker 執行的工作流程設定追蹤,請加入追蹤提供者做為 WorkflowInvoker 執行個體的延伸。下列範例程式碼範例是取自自訂追蹤範例。

WorkflowInvoker invoker = new WorkflowInvoker(BuildSampleWorkflow());
invoker.Extensions.Add(customTrackingParticipant);
invoker.Invoke();

在事件檢視器中檢視追蹤記錄

如果使用 EtwTrackingParticipant 延伸,追蹤記錄會出現在 Microsoft、Windows 和應用程式伺服器-應用程式節點的分析記錄中。若要檢視追蹤記錄,請遵循下列步驟。

  1. 若要開啟 [事件檢視器],以滑鼠右鍵按一下 [開始],然後按一下 [執行]。在 [執行] 對話方塊中,輸入 eventvwr

  2. 在 [事件檢視器] 對話方塊中,展開 [應用程式及服務記錄檔] 節點。

  3. 展開 [Microsoft]、[Windows] 和 [應用程式伺服器-應用程式] 節點。

  4. 以滑鼠右鍵按一下 [應用程式伺服器-應用程式] 節點底下的 [分析],並且選取 [啟用記錄]。

  5. 執行您的啟用追蹤的應用程式,以產生追蹤記錄。

  6. 以滑鼠右鍵按一下 [分析] 節點,並選取 [重新整理]。追蹤記錄應該會顯示在中央窗格中。

下圖顯示事件檢視器中的追蹤事件。

事件檢視器顯示追蹤記錄

註冊應用程式特定的提供者識別碼

如果事件必須寫入至特定應用程式記錄檔,請遵循下列步驟註冊新提供者資訊清單。

  1. 在應用程式的組態檔中宣告提供者識別碼。

    <system.serviceModel>
        <diagnostics etwProviderId="2720e974-9fe9-477a-bb60-81fe3bf91eec"/>
    </system.serviceModel>
    
  2. 將資訊清單檔從 %windir%\Microsoft.NET\Framework\<最新版本 .NET Framework 4>\Microsoft.Windows.ApplicationServer.Applications.man 複製到暫存位置,並將檔案重新命名為 Microsoft.Windows.ApplicationServer.Applications_Provider1.man。

  3. 將資訊清單檔中的 GUID 變更為新的 GUID。

    <provider name="Microsoft-Windows-Application Server-Applications" guid="{2720e974-9fe9-477a-bb60-81fe3bf91eec}"
    
  4. 如果您不要解除安裝預設提供者,請變更提供者名稱。

    <provider name="Microsoft-Windows-Application Server-Applications" guid="{2720e974-9fe9-477a-bb60-81fe3bf91eec}"
    
  5. 如果您在上一個步驟中變更提供者名稱,請將資訊清單檔中的通道名稱變更為新的提供者名稱。

    <channel name="Microsoft-Windows-Application Server-Applications_Provider1/Admin" chid="ADMIN_CHANNEL" symbol="ADMIN_CHANNEL" type="Admin" enabled="false" isolation="Application" message="$(string.MICROSOFT_WINDOWS_APPLICATIONSERVER_APPLICATIONS.channel.ADMIN_CHANNEL.message)" />
    <channel name="Microsoft-Windows-Application Server-Applications_Provider1/Operational" chid="OPERATIONAL_CHANNEL" symbol="OPERATIONAL_CHANNEL" type="Operational" enabled="false" isolation="Application" message="$(string.MICROSOFT_WINDOWS_APPLICATIONSERVER_APPLICATIONS.channel.OPERATIONAL_CHANNEL.message)" />
    <channel name="Microsoft-Windows-Application Server-Applications_Provider1/Analytic" chid="ANALYTIC_CHANNEL" symbol="ANALYTIC_CHANNEL" type="Analytic" enabled="false" isolation="Application" message="$(string.MICROSOFT_WINDOWS_APPLICATIONSERVER_APPLICATIONS.channel.ANALYTIC_CHANNEL.message)" />
    <channel name="Microsoft-Windows-Application Server-Applications_Provider1/Debug" chid="DEBUG_CHANNEL" symbol="DEBUG_CHANNEL" type="Debug" enabled="false" isolation="Application" message="$(string.MICROSOFT_WINDOWS_APPLICATIONSERVER_APPLICATIONS.channel.DEBUG_CHANNEL.message)" />
    <channel name="Microsoft-Windows-Application Server-Applications_Provider1/Perf" chid="PERF_CHANNEL" symbol="PERF_CHANNEL" type="Analytic" enabled="false" isolation="Application" message="$(string.MICROSOFT_WINDOWS_APPLICATIONSERVER_APPLICATIONS.channel.PERF_CHANNEL.message)" />
    
  6. 遵循下列步驟產生資源 DLL。

    1. 安裝 Windows SDK。Windows SDK 包含訊息編輯器 (mc.exe) 和資源編輯器 (rc.exe)。

    2. 在 Windows SDK 命令提示字元中,對新的資訊清單檔執行 mc.exe。

      mc.exe Microsoft.Windows.ApplicationServer.Applications_Provider1.man 
      
    3. 對上一個步驟中產生的資源檔執行 rc.exe。

      rc.exe  Microsoft.Windows.ApplicationServer.Applications_Provider1.rc
      
    4. 建立名為 NewProviderReg.cs 的空白 cs 檔案。

    5. 使用 C# 編輯器建立資源 DLL。

      csc /target:library /win32res:Microsoft.Windows.ApplicationServer.Applications_Provider1.res NewProviderReg.cs /out:Microsoft.Windows.ApplicationServer.Applications_Provider1.dll
      
    6. 將資訊清單檔中的資源和訊息 dll 名稱從 Microsoft.Windows.ApplicationServer.Applications.Provider1.man 變更為新的 dll 名稱。

      <provider name="Microsoft-Windows-Application Server-Applications_Provider1" guid="{2720e974-9fe9-477a-bb60-81fe3bf91eec}" symbol="Microsoft_Windows_ApplicationServer_ApplicationEvents" resourceFileName="<dll directory>\Microsoft.Windows.ApplicationServer.Applications_Provider1.dll" messageFileName="<dll directory>\Microsoft.Windows.ApplicationServer.Applications_Provider1.dll">
      
    7. 使用 wevtutil 註冊資訊清單。

      wevtutil im Microsoft.Windows.ApplicationServer.Applications_Provider1.man