共用方式為


追蹤設定檔

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

追蹤設定檔包含有追蹤查詢,這些查詢允許追蹤參與者訂閱工作流程執行個體狀態在執行時期變更時所發出的工作流程事件。

追蹤設定檔

根據您的監控需求,您可以寫入非常廣泛的設定檔,使其訂閱工作流程上的一組小型高階狀態變更。反之,您也可以建立非常詳細的設定檔,取得充分的結果事件,以便在日後重新建構為詳細的執行流程。

追蹤設定檔會顯示為標準 .NET Framework 組態檔中的 XML 項目,或在程式碼中指定。下列範例是組態檔中的 .NET Framework 版本 4 追蹤設定檔,可允許追蹤參與者訂閱 StartedCompleted 工作流程事件。

<system.serviceModel>
    …
    <tracking>  
      <trackingProfile name="Sample Tracking Profile">
        <workflow activityDefinitionId="*">
  <workflowInstanceQueries>
          <workflowInstanceQuery>
            <states>
              <state name="Started"/>
              <state name="Completed"/>
            </states>
          </workflowInstanceQuery>
  </workflowInstanceQueries>
        </workflow>
      </trackingProfile>        
    </profiles>
  </tracking>
    …
</system.serviceModel>  

追蹤記錄是利用 ImplementationVisibility 屬性,透過追蹤設定檔內的可見性模式所篩選的。複合活動是最上層的活動,其中包含形成其實作的其他活動。可見性模式會透過指定從工作流程活動內的複合活動發出的追蹤記錄,指定是否要追蹤形成實作的活動。可見性模式會在追蹤設定檔層級套用。在工作流程中的個別活動,其追蹤記錄的篩選會由追蹤設定檔內的查詢控制。如需詳細資訊,請參閱本文件的追蹤設定檔查詢類型一節。

追蹤設定檔中,以 implementationVisibility 屬性指定的兩個可見性模式為 RootScopeAll。若複合活動不是工作流程的根,使用 RootScope 模式會隱藏形成活動之實作的追蹤記錄。也就是說,將使用其他活動實作的活動加入至工作流程中,且 implementationVisibility 設定為 RootScope 時,只會追蹤該複合活動內的最上層活動。若活動是工作流程的根,則該活動的實作會是工作流程本身,且會針對形成實作的活動發出追蹤記錄。使用 All 模式可發出根活動及所有其複合活動的全部追蹤記錄。

例如,假設 MyActivity 是複合活動,其實作包含兩個活動:Activity1Activity2。將這個活動加入至工作流程,並以 implementationVisibility 設定為 RootScope, 的追蹤設定檔啟用追蹤時,只會發出 MyActivity 的追蹤記錄,卻不會發出 Activity1Activity2 這兩個活動的記錄。

然而,如果追蹤設定檔的 implementationVisisbility 屬性設定為 All,則不僅會發出 MyActivity 的追蹤記錄,也會發出 Activity1Activity2 活動的追蹤記錄。

implementationVisibility 旗標適用於下列追蹤記錄類型:

  • ActivityStateRecord

  • FaultPropagationRecord

  • CancelRequestedRecord

  • ActivityScheduledRecord

Ee513989.note(zh-tw,VS.100).gif注意:
implementationVisibility 設定不會篩選出從活動實作發出的 CustomTrackingRecords。

implementationVisibility 功能會在程式碼中的追蹤設定檔指定,如下所示:

 TrackingProfile sampleTrackingProfile = new TrackingProfile()
{
                 Name = "Sample Tracking Profile"
                 ActivityDefinitionId="EmailWorkflow"
                 ImplementationVisibility = ImplementationVisibility.RootScope
}

implementationVisibility 功能可在組態檔中的追蹤設定檔指定,如下所示:

<tracking>
      <profiles>
        <trackingProfile name="Shipping Monitoring" implementationVisibility="All">
          <workflow activityDefinitionId="*">
….
         </workflow>
        </trackingProfile>
      </profiles>
</tracking>
 

追蹤設定檔的 ImplementationVisibility 設定是選擇性的。根據預設,其值會設定為 RootScope。這個屬性的值也會區分大小寫。

追蹤設定檔查詢類型

追蹤設定檔會結構化成追蹤記錄的宣告式訂閱,可讓您查詢特定追蹤記錄的工作流程執行階段。您可以使用數個查詢型別訂閱不同類別的 TrackingRecord 物件。追蹤設定檔可在組態中指定,或是透過程式碼指定。以下是最常見的查詢類型:

  • WorkflowInstanceQuery - 使用這個查詢,即可追蹤工作流程執行個體生命週期變更,例如先前示範的 StartedCompletedWorkflowInstanceQuery 會用來訂閱下列 TrackingRecord 物件:

    可供訂閱的狀態可於 WorkflowInstanceStates 類別中指定。

    下列範例示範使用 WorkflowInstanceQuery 訂閱 Started 執行個體狀態之工作流程執行個體層級追蹤記錄的組態或程式碼。

    <workflowInstanceQueries>
        <workflowInstanceQuery>
          <states>
            <state name="Started"/>
          </states>
        </workflowInstanceQuery>
    </workflowInstanceQueries>
    
    TrackingProfile sampleTrackingProfile = new TrackingProfile()
    {
                     Name = "Sample Tracking Profile"
                     ActivityDefinitionId="EmailWorkflow"
                     Queries = 
                       {
                         new WorkflowInstanceQuery()
                            {
                               States = { WorkflowInstanceStates.Started}
    
                            }
                        }
    }
    
  • ActivityStateQuery - 使用這個查詢,即可追蹤組成工作流程執行個體之活動的生命週期變更。例如,您可能想要追蹤在工作流程執行個體中完成的每一次「傳送電子郵件」活動。TrackingParticipant 訂閱 ActivityStateRecord 物件時,必須要有這個查詢。可供訂閱的狀態可於 ActivityStates 中指定。

    下列範例示範訂閱使用 ActivityStateQuery 做為 SendEmailActivity 活動之活動狀態追蹤記錄的組態和程式碼。

    <activityStateQueries>
           <activityStateQuery activityName="SendEmailActivity">
               <states>
                      <state name="Closed"/>
               </states>
           </activityStateQuery>
    </activityStateQueries>
    
    TrackingProfile sampleTrackingProfile = new TrackingProfile()
    {
         Name = "Sample Tracking Profile"
         ActivityDefinitionId="EmailWorkflow"
         Queries = {
              new ActivityStateQuery()
                       {                            
                       ActivityName = "SendEmailActivity",
                       States = { ActivityStates.Closed }
                       }
                   }
    }
    
  • ActivityScheduledQuery - 這個查詢可讓您追蹤由父活動排程執行的活動。TrackingParticipant 訂閱 ActivityScheduledRecord 物件時,必須要有這個查詢。

    下列範例示範訂閱使用 ActivityScheduledQuery 排定的 SendEmailActivity 子活動之相關記錄的組態和程式碼。

    <activityScheduledQueries>
                  <activityScheduledQuery activityName="ProcessNotificationsActivity" childActivityName=" SendEmailActivity" />
     </activityScheduledQueries>
    
    TrackingProfile sampleTrackingProfile = new TrackingProfile()
    {
         Name = "Sample Tracking Profile"
         ActivityDefinitionId="EmailWorkflow"
         Queries = {
                    new ActivityScheduledQuery()
                      {
                      ActivityName = "ProcessNotificationsActivity",
                      ChildActivityName = "SendEmailActivity"
                      }
                   }
    }
    
  • FaultPropagationQuery - 使用這個查詢,即可追蹤活動中發生的錯誤處理。TrackingParticipant 訂閱 FaultPropagationRecord 物件時,必須要有這個查詢。

    下列範例示範使用 FaultPropagationQuery 訂閱與錯誤傳播相關之記錄的組態和程式碼。

    <faultPropagationQueries>
                  <faultPropagationQuery faultSourceActivityName="SendEmailActivity" faultHandlerActivityName="NotificationsFaultHandler" />
    </faultPropagationQueries>
    
    TrackingProfile sampleTrackingProfile = new TrackingProfile()
    {
         Name = "Sample Tracking Profile"
         ActivityDefinitionId="EmailWorkflow"
         Queries = {
                           new FaultPropagationQuery()
                            {
                                FaultSourceActivityName = "SendEmailActivity",
                                FaultHandlerActivityName = "NotificationsFaultHandler"
                            }
                    }
    }
    
  • CancelRequestedQuery - 使用這個查詢,即可追蹤父活動取消子活動的要求。TrackingParticipant 訂閱 CancelRequestedRecord 物件時,必須要有這個查詢。

    下列範例示範使用 CancelRequestedQuery 訂閱與活動取消相關之記錄的組態和程式碼。

    <cancelRequestedQueries>
          <cancelRequestedQuery activityName="ProcessNotificationsActivity" childActivityName="SendEmailActivity" />
    </cancelRequestedQueries>
    
    TrackingProfile sampleTrackingProfile = new TrackingProfile()
    { 
         Name = "Sample Tracking Profile"
         ActivityDefinitionId="EmailWorkflow"
         Queries = 
                {
                  new CancelRequestedQuery()
                     {
                     ActivityName = "ProcessNotificationsActivity",
                     ChildActivityName = "SendEmailActivity"
                     }
                  }
    }
    
  • CustomTrackingQuery - 使用這個查詢,即可追蹤程式碼活動中定義的事件。TrackingParticipant 訂閱 CustomTrackingRecord 物件時,必須要有這個查詢。

    下列範例示範使用 CustomTrackingQuery 訂閱與自訂追蹤記錄相關之記錄的組態和程式碼。

    <customTrackingQueries>
         <customTrackingQuery name="EmailAddress" activityName="SendEmailActivity" />
    </customTrackingQueries>
    
    TrackingProfile sampleTrackingProfile = new TrackingProfile()
    {
         Name = "Sample Tracking Profile"
         ActivityDefinitionId="EmailWorkflow"
         Queries = 
                 {
                 new CustomTrackingQuery() 
                            {
                             Name = "EmailAddress",
                             ActivityName = "SendEmailActivity"
                            }
                 }
    }
    
  • BookmarkResumptionQuery - 使用這個查詢,即可追蹤工作流程執行個體中書籤的繼續。TrackingParticipant 訂閱 BookmarkResumptionRecord 物件時,必須要有這個查詢。

    下列範例示範使用 BookmarkResumptionQuery 訂閱與書籤繼續相關之記錄的組態和程式碼。

    <bookmarkResumptionQueries>
                 <bookmarkResumptionQuery name="SentEmailBookmark" />
                </bookmarkResumptionQueries>
    
    TrackingProfile sampleTrackingProfile = new TrackingProfile()
    {
         Name = "Sample Tracking Profile"
         ActivityDefinitionId="EmailWorkflow"
         Queries = 
                 {
                 new BookmarkResumptionQuery()
                            {
                            Name = "sentEmailBookmark"
                            }
                    }
    }
    

變數與引數

追蹤工作流程的執行時,擷取資料通常很實用。它可在存取追蹤記錄後期執行時,提供額外的內容。在 .NET Framework 4 中,您可以在使用追蹤的工作流程中的任何活動範圍內擷取任何可見的變數或引數。追蹤設定檔讓擷取資料變得非常容易。

變數和引數的擷取會在活動發出 ActivityStateRecord 時進行。如果變數在活動的範圍內,則僅供擷取使用。要以活動擷取的變數會以下列方式指定

  • 如果以變數名稱指定變數,則追蹤會在目前所追蹤的活動及父活動內尋找該變數。追蹤會在目前活動範圍及父範圍中搜尋變數。

  • 如果要擷取的變數是以 name=”*” 指定的,則會擷取目前追蹤之活動內的所有變數。在此情況下,則不會擷取在範圍內但未在父活動中定義的變數。

擷取引數時,會根據活動的狀態擷取引數。當活動的狀態是 Executing 時,則只有 InArguments 可供擷取。若為其他任何活動狀態 (Closed、Faulted、Canceled),則所有引數 (無論是 InArgument 及 OutArgument) 皆可供擷取。

下列範例示範活動狀態查詢,此查詢會在發出活動的 Closed 追蹤記錄時擷取變數及引數。變數和引數只能使用 ActivityStateRecord 擷取,因此可在追蹤設定檔中使用 ActivityStateQuery 訂閱。

<activityStateQuery activityName="SendEmailActivity">
  <states>
    <state name="Closed"/>
  </states>
  <variables>
    <variable name="FromAddress"/>
  </variables>
  <arguments>
    <argument name="Result"/>
  </arguments>
</activityStateQuery>

儲存在變數/引數中的保護資訊

WF 執行階段預設會顯示所追蹤的變數或引數。工作流程開發人員可以採取適當的步驟,保護變數或引數不受存取。

  1. 加密變數的值。

  2. 控制追蹤設定檔的撰寫,防止擷取變數或引數。

  3. 若為自訂追蹤參與者,請確定 WF 程式碼不會公開儲存在變數或引數中的機密資訊。

附註

附註可讓您使用值任意標記追蹤記錄,該值可在建置階段後設定。例如,您可能想要將跨多個工作流程的數個追蹤記錄標記為 “Mail Server” == “Mail Server1”。當您稍後查詢追蹤記錄時,就可以更輕鬆地找到所有具有這個標記的記錄。

若要完成這個目的,就需要將附註加入至追蹤查詢,如下列範例所示。

<activityStateQuery activityName="SendEmailActivity">
  <states>
    <state name="Closed"/>
  </states>
  <annotations>
    <annotation name="MailServer" value="Mail Server1"/>
  </annotations>
</activityStateQuery>

如何建立追蹤設定檔

追蹤查詢項目會用來建立使用 XML 組態檔或 .NET Framework 4 程式碼的追蹤設定檔。以下是使用組態檔建立的追蹤設定檔範例。

<system.serviceModel>
         <tracking>
                 <profiles>
                       <trackingProfile name="Sample Tracking Profile ">
                            <workflow activityDefinitionId="*">
                           <!—Specify the tracking profile query elements to subscribe for tracking records
                            -->
                             </workflow>
                        </trackingProfile>
                 </profiles>
          </tracking>
</system.seriviceModel>
Ee513989.Warning(zh-tw,VS.100).gif 注意:
針對使用工作流程服務主機的 WF,追蹤設定檔通常會使用組態檔建立。您也可以使用追蹤設定檔和追蹤查詢 API,以程式碼建立追蹤設定檔。

設定為 XML 組態檔的設定檔會使用行為擴充套用至追蹤參與者。這會加入至 WorkflowServiceHost,如稍後的設定工作流程的追蹤一節所述。

主機發出之追蹤記錄的詳細資訊取決於追蹤設定檔內的組態設定。追蹤參與者可將查詢加入至追蹤設定檔,以訂閱追蹤記錄。若要訂閱所有追蹤記錄,追蹤設定檔需在每個查詢的名稱欄位中使用 “*” 指定所有追蹤查詢。

以下是追蹤設定檔的一些通用範例。

  • 取得工作流程執行個體記錄和錯誤的追蹤設定檔。
<trackingProfile name="Instance and Fault Records">
  <workflow activityDefinitionId="*">
    <workflowInstanceQueries>   
      <workflowInstanceQuery>
        <states>
          <state name="*" />
        </states>
      </workflowInstanceQuery>
    </workflowInstanceQueries>
    <activityStateQueries>
      <activityStateQuery activityName="*">
        <states>
          <state name="Faulted"/>
        </states>
       </activityStateQuery>
    </activityStateQueries>
  </workflow>
</trackingProfile>
  1. 取得所有自訂追蹤記錄的追蹤設定檔。
<trackingProfile name="Instance_And_Custom_Records">
      <workflow activityDefinitionId="*">
            <customTrackingQueries>
                 <customTrackingQuery name="*" activityName="*" />
            </customTrackingQueries>
      </workflow>
</trackingProfile>