Freigeben über


Überwachungsprofile

Dieses Thema gilt für Windows Workflow Foundation 4.

Überwachungsprofile enthalten Nachverfolgungsabfragen, mit denen ein Überwachungsteilnehmer Workflowereignisse abonnieren kann. Diese werden ausgegeben, wenn sich der Zustand einer Workflowinstanz zur Laufzeit ändert.

Überwachungsprofile

Je nach Überwachungsanforderungen können Sie ein Profil schreiben, das sehr allgemein gehalten ist und einen kleinen Satz von unspezifischen Zustandsänderungen eines Workflows abonniert. Umgekehrt ist es möglich, ein sehr ausführliches Profil zu erstellen, dessen resultierende Ereignisse umfangreich genug sind, um später einen detaillierten Ausführungsfluss zu rekonstruieren.

Überwachungsprofile sind XML-Elemente, die innerhalb einer standardmäßigen .NET Framework-Konfigurationsdatei oder in Code angegeben werden. Das folgende Beispiel ist einem .NET Framework, Version 4-Überwachungsprofil in einer Konfigurationsdatei entnommen, die es einem Überwachungsteilnehmer ermöglicht, Started-Workflowereignisse und Completed-Workflowereignisse zu abonnieren.

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

Überwachungsdatensätze werden innerhalb eines Überwachungsprofils mit dem ImplementationVisibility-Attribut über den Sichtbarkeitsmodus gefiltert. Eine zusammengesetzte Aktivität ist eine allgemeine Aktivität mit weiteren Aktivitäten, die ihre Implementierung bilden. Der Sichtbarkeitsmodus gibt die von zusammengesetzten Aktivitäten in einer Workflowaktivität ausgegebenen Überwachungsdatensätze an. Damit wird bestimmt, ob Aktivitäten, aus denen die Implementierung besteht, nachverfolgt werden. Der Sichtbarkeitsmodus gilt für die Ebene des Überwachungsprofils. Die Filterung von Überwachungsdatensätzen für einzelne Aktivitäten eines Workflows wird von den Abfragen im Überwachungsprofil gesteuert. Weitere Informationen finden Sie im AbschnittAbfragetypen für Überwachungsprofile in diesem Dokument.

Die zwei Sichtbarkeitsmodi, die vom implementationVisibility-Attribut im Überwachungsprofil angegeben werden, sind RootScope und All. Durch Verwendung des RootScope-Modus werden Überwachungsdatensätze für Aktivitäten, die die Implementierung einer Aktivität bilden, unterdrückt, wenn der Stamm eines Workflows keine zusammengesetzte Aktivität ist. Dies bedeutet, dass nur die allgemeine Aktivität innerhalb der zusammengesetzten Aktivität nachverfolgt wird, wenn einem Workflow eine Aktivität hinzugefügt wird, die mit anderen Aktivitäten implementiert wird, und implementationVisibility auf RootScope festgelegt ist. Wenn eine Aktivität der Stamm des Workflows ist, stellt die Implementierung der Aktivität den Workflow selbst dar, und Überwachungsdatensätze werden für Aktivitäten ausgegeben, die die Implementierung bilden. Bei Verwendung des All-Modus werden die Überwachungsdatensätze für die Stammaktivität und alle zugehörigen zusammengesetzten Aktivitäten ausgegeben.

Beispiel: MyActivity ist eine zusammengesetzte Aktivität, deren Implementierung die zwei Aktivitäten Activity1 und Activity2 enthält. Wenn diese Aktivität einem Workflow hinzugefügt wird und die Nachverfolgung mit einem Überwachungsprofil aktiviert wird, bei dem implementationVisibility zu RootScope festgelegt wurde, werden Überwachungsdatensätze nur für MyActivity ausgegeben. Für die Aktivitäten Activity1 und Activity2 werden jedoch keine Datensätze ausgegeben.

Wurde das implementationVisisbility-Attribut hingegen für das Überwachungsprofil auf All festgelegt, werden Überwachungsdatensätze nicht nur für MyActivity ausgegeben, sondern auch für die Aktivitäten Activity1 und Activity2.

Das implementationVisibility-Flag gilt für folgende Datensatztypen für die Nachverfolgung:

  • ActivityStateRecord

  • FaultPropagationRecord

  • CancelRequestedRecord

  • ActivityScheduledRecord

Ee513989.note(de-de,VS.100).gifHinweis:
Von der Aktivitätsimplementierung ausgegebene CustomTrackingRecords werden von der implementationVisibility-Einstellung nicht herausgefiltert.

Die implementationVisibility-Funktionalität wird für das Überwachungsprofil auf folgende Weise in Code angegeben:

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

Die implementationVisibility-Funktionalität kann für das Überwachungsprofil auf folgende Weise in einer Konfigurationsdatei angegeben werden:

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

Die ImplementationVisibility-Einstellung ist für das Überwachungsprofil optional. Standardmäßig ist der Wert auf RootScope festgelegt. Bei den Werten für dieses Attribut muss die Groß-/Kleinschreibung beachtet werden.

Abfragetypen für Überwachungsprofile

Überwachungsprofile werden als deklarative Abonnements für Überwachungsdatensätze angeordnet, die es Ihnen ermöglichen, bestimmte Überwachungsdatensätze aus der Workflowlaufzeit abzufragen. Es gibt mehrere Abfragetypen, mit denen Sie andere Klassen von TrackingRecord-Objekten abonnieren können. Überwachungsprofile können in der Konfiguration oder durch Code angegeben werden. Im Folgenden werden die häufigsten Abfragetypen aufgeführt:

  • WorkflowInstanceQuery – Hiermit können Sie Änderungen am Workflowinstanz-Lebenszyklus nachverfolgen, z. B. die bereits erwähnten Optionen Started und Completed. WorkflowInstanceQuery – Wird für das Abonnieren der folgenden TrackingRecord-Objekte verwendet:

    Jeder Zustand, der abonniert werden kann, ist in der WorkflowInstanceStates-Klasse angegeben.

    Die Konfiguration bzw. der Code zum Abonnieren von Überwachungsdatensätzen auf Workflowinstanzebene für den Started-Instanzzustand mit dem WorkflowInstanceQuery-Objekt wird im folgenden Beispiel gezeigt.

    <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 – Hiermit können Sie die Lebenszyklusänderungen der Aktivitäten nachverfolgen, aus denen eine Workflowinstanz besteht. Beispielsweise könnten Sie jede abgeschlossene Aktivität der Art "E-Mail senden" innerhalb einer Workflowinstanz nachverfolgen. Diese Abfrage ist notwendig, damit ein TrackingParticipant-Objekt ActivityStateRecord-Objekte abonnieren kann. Die verfügbaren Zustände, die abonniert werden können, werden im ActivityStates-Objekt angegeben.

    Die Konfiguration und der Code zum Abonnieren von Überwachungsdatensätzen für den Aktivitätszustand, die das ActivityStateQuery-Objekt für die SendEmailActivity-Aktivität verwenden, werden im folgenden Beispiel gezeigt.

    <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 – Mit dieser Abfrage können Sie eine Aktivität nachverfolgen, die von einer übergeordneten Aktivität ausgeführt werden soll. Die Abfrage ist notwendig, damit ein TrackingParticipant-Objekt ActivityScheduledRecord-Objekte abonnieren kann.

    Die Konfiguration und der Code zum Abonnieren von Datensätzen, die mit der untergeordneten SendEmailActivity-Aktivität verknüpft sind, deren Planung mit dem ActivityScheduledQuery-Objekt erfolgt, wird im folgenden Beispiel gezeigt.

    <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 – Hiermit können Sie die Behandlung von Fehlern nachverfolgen, die in einer Aktivität auftreten. Die Abfrage ist notwendig, damit ein TrackingParticipant-Objekt FaultPropagationRecord-Objekte abonnieren kann.

    Die Konfiguration und der Code zum Abonnieren von mit der Fehlerweitergabe verknüpften Datensätzen mithilfe von FaultPropagationQuery werden im folgenden Beispiel gezeigt.

    <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 – Hiermit können Sie Anforderungen zum Abbrechen einer untergeordneten Aktivität durch die übergeordnete Aktivität nachverfolgen. Die Abfrage ist notwendig, damit ein TrackingParticipant-Objekt CancelRequestedRecord-Objekte abonnieren kann.

    Die Konfiguration und der Code zum Abonnieren von mit dem Aktivitätenabbruch verknüpften Datensätzen mithilfe von CancelRequestedQuery werden im folgenden Beispiel gezeigt.

    <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 – Hiermit können Sie Ereignisse nachverfolgen, die Sie in den Codeaktivitäten definieren. Die Abfrage ist notwendig, damit ein TrackingParticipant-Objekt CustomTrackingRecord-Objekte abonnieren kann.

    Die Konfiguration und der Code zum Abonnieren von mit der benutzerdefinierten Nachverfolgung verknüpften Datensätzen mit CustomTrackingQuery werden im folgenden Beispiel gezeigt.

    <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 – Hiermit können Sie die Wiederaufnahme eines Lesezeichens in einer Workflowinstanz nachverfolgen. Diese Abfrage ist notwendig, damit ein TrackingParticipant-Objekt BookmarkResumptionRecord-Objekte abonnieren kann.

    Die Konfiguration und der Code zum Abonnieren von mit der Wiederaufnahme von Lesezeichen verknüpften Datensätzen mithilfe von BookmarkResumptionQuery werden im folgenden Beispiel gezeigt.

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

Variablen und Argumente

Bei der Nachverfolgung der Ausführung eines Workflows kann sich die Extraktion von Daten oft als nützlich erweisen. Sie stellt zusätzlichen Kontext bereit, wenn nach der Ausführung auf einen Überwachungsdatensatz zugegriffen wird. In .NET Framework 4 können Sie alle sichtbaren Variablen oder Argumente innerhalb des Bereichs einer Aktivität in einem Workflow mithilfe der Nachverfolgung extrahieren. Überwachungsprofile vereinfachen die Extraktion von Daten.

Variablen und Argumente werden extrahiert, wenn eine Aktivität einen ActivityStateRecord ausgibt. Eine Variable kann nur extrahiert werden, wenn sie innerhalb des Bereichs der Aktivität liegt. Eine Variable, die mit einer Aktivität extrahiert werden soll, wird auf die folgende Weise angegeben.

  • Wenn eine Variable über den Variablennamen angegeben wird, sucht die Nachverfolgung in der aktuellen Aktivität, die nachverfolgt wird, und in den übergeordneten Aktivitäten nach der Variable. Es wird im aktuelle Aktivitätsbereich und im übergeordneten Bereich nach der Variable gesucht.

  • Wenn Variablen, die extrahiert werden sollen, mit name="*" angegeben werden, werden alle Variablen innerhalb der aktuellen Aktivität, die nachverfolgt wird, extrahiert. In diesem Fall werden keine Variablen extrahiert, die innerhalb des Bereichs liegen, jedoch in übergeordneten Aktivitäten definiert sind.

Bei der Extraktion von Argumenten sind die extrahierten Argumente vom Zustand der Aktivität abhängig. Wenn der Zustand einer Aktivität "Executing" ist, können nur InArguments extrahiert werden. Bei jedem anderen Aktivitätszustand (Closed, Faulted, Canceled) können alle Argumente, InArguments und OutArguments extrahiert werden.

Das folgende Beispiel zeigt eine Abfrage des Aktivitätszustands, mit der Variablen und Argumente extrahiert werden, wenn der Closed-Überwachungsdatensatz der Aktivität ausgegeben wird. Variablen und Argumente können nur mit einem ActivityStateRecord-Objekt extrahiert und so innerhalb eines Überwachungsprofils mit ActivityStateQuery abonniert werden.

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

Schützen von Informationen, die in Variablen/Argumenten gespeichert sind

Eine nachverfolgte Variable oder ein nachverfolgtes Argument wird standardmäßig von der WF-Laufzeit sichtbar gemacht. Ein Workflowentwickler kann es mit den richtigen Schritten vor Zugriffen schützen.

  1. Verschlüsseln Sie den Wert einer Variable.

  2. Steuern Sie die Erstellung eines Überwachungsprofils, um die Extraktion von Variablen oder Argumenten zu verhindern.

  3. Stellen Sie bei benutzerdefinierten Überwachungsteilnehmern sicher, dass im WF-Code keine vertraulichen Informationen angegeben sind, die in Variablen oder Argumenten gespeichert werden.

Anmerkungen

Anmerkungen ermöglichen es Ihnen, Überwachungsdatensätze willkürlich mit einem Wert zu markieren, der nach der Erstellung konfiguriert werden kann. Sie könnten z. B. mehrere Überwachungsdatensätze in mehreren Workflows mit "Mail Server" == "Mail Server1" markieren. Auf diese Weise können alle Datensätze mit diesem Tag einfach gefunden werden, wenn zu einem späteren Zeitpunkt Überwachungsdatensätze abgefragt werden.

Damit dies funktioniert, wird einer Überwachungsabfrage eine Anmerkung hinzugefügt, wie im folgenden Beispiel gezeigt.

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

Vorgehensweise für das Erstellen eines Überwachungsprofils

Mit Überwachungsabfrageelementen wird ein Überwachungsprofil erstellt. Dazu wird entweder eine XML-Konfigurationsdatei oder .NET Framework 4-Code verwendet. Im Folgenden finden Sie ein Beispiel für ein mit einer Konfigurationsdatei erstelltes Überwachungsprofil.

<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(de-de,VS.100).gif Vorsicht:
Bei WF mit dem Workflowdiensthost wird das Überwachungsprofil in der Regel mit einer Konfigurationsdatei erstellt. Es ist auch möglich, ein Überwachungsprofil mit Code zu erstellen. Dazu wird die API für Überwachungsprofile und Überwachungsabfragen verwendet.

Ein Profil, das als XML-Konfigurationsdatei konfiguriert ist, wird mit einer Verhaltenserweiterung auf einen Überwachungsteilnehmer angewendet. Dies wird einem WorkflowServiceHost hinzugefügt, wie weiter unten im Abschnitt Konfigurieren der Nachverfolgung für einen Workflow beschrieben.

Der Detailliertheitsgrad der Überwachungsdatensätze, die vom Host ausgegeben werden, wird von den Konfigurationseinstellungen im Überwachungsprofil bestimmt. Ein Überwachungsteilnehmer abonniert Überwachungsdatensätze, indem einem Überwachungsprofil Abfragen hinzugefügt werden. Zum Abonnieren aller Überwachungsdatensätze müssen im Überwachungsprofil alle Überwachungsabfragen mit "*" in den Namensfeldern der einzelnen Abfragen angegeben werden.

Es folgen einige häufige Beispiele für Überwachungsprofile.

  • Ein Überwachungsprofil zum Abfragen von Workflowinstanz-Datensätzen und -fehlern
<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. Ein Überwachungsprofil zum Abfragen aller benutzerdefinierten Überwachungsdatensätze
<trackingProfile name="Instance_And_Custom_Records">
      <workflow activityDefinitionId="*">
            <customTrackingQueries>
                 <customTrackingQuery name="*" activityName="*" />
            </customTrackingQueries>
      </workflow>
</trackingProfile>