Profili di rilevamento

I profili di rilevamento contengono query di rilevamento che consentono a un partecipante del rilevamento di sottoscrivere gli eventi del flusso di lavoro generati quando lo stato di un'istanza del flusso di lavoro cambia in fase di esecuzione.

Profili di rilevamento

I profili di rilevamento vengono usati per specificare le informazioni di rilevamento generate per un'istanza del flusso di lavoro. Se non è specificato alcun profilo, vengono generati tutti gli eventi di rilevamento. Se viene specificato un profilo, verranno generati gli eventi di rilevamento specificati nel profilo. A seconda dei requisiti di monitoraggio, è possibile scrivere un profilo molto generale che sottoscrive un piccolo set di modifiche dello stato di alto livello in un flusso di lavoro oppure creare un profilo molto dettagliato i cui eventi risultanti sono sufficientemente precisi per ricostruire un flusso di esecuzione dettagliato in un secondo momento.

I profili di rilevamento si manifestano come elementi XML all'interno di un file di configurazione standard di .NET Framework o specificati nel codice. L'esempio seguente illustra un profilo di rilevamento di .NET Framework 4.6.1 in un file di configurazione che consente a un partecipante del rilevamento di sottoscrivere gli eventi del flusso di lavoro Started e Completed.

<system.serviceModel>
    ...
    <tracking>
     <profiles>
      <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>

Nell'esempio seguente viene illustrato il profilo di rilevamento equivalente creato usando il codice.

TrackingProfile profile = new TrackingProfile()
{
    Name = "CustomTrackingProfile",
    Queries =
    {
        new WorkflowInstanceQuery()
        {
            // Limit workflow instance tracking records for started and
            // completed workflow states.
            States = { WorkflowInstanceStates.Started, WorkflowInstanceStates.Completed },
        }
    }
};

I record di rilevamento vengono filtrati tramite la modalità di visibilità all'interno di un profilo di rilevamento usando l'attributo ImplementationVisibility. Un'attività composita è un'attività di primo livello che contiene le altre attività che formano l'implementazione. La modalità di visibilità specifica i record di rilevamento creati dalle attività composite all'interno di un'attività di flusso di lavoro per specificare se le attività che formano l'implementazione vengono rilevate. La modalità di visibilità si applica a livello del profilo di rilevamento. L'applicazione di filtri ai record di rilevamento per singole attività all'interno di un flusso di lavoro viene controllata dalle query incluse nel profilo di rilevamento. Per altre informazioni, vedere la sezione Tipi di query del profilo di rilevamento in questo documento.

Le due modalità di visibilità specificate dall'attributo implementationVisibility nel profilo di rilevamento sono: RootScope e All. Usando la modalità RootScope vengono eliminati i record di rilevamento per le attività che formano l'implementazione di un'attività nel caso in cui un'attività composita non costituisca la radice di un flusso di lavoro. Di conseguenza, quando un'attività implementata tramite altre attività viene aggiunta a un flusso di lavoro e l'attributo implementationVisibility viene impostato su RootScope, viene rilevata solo l'attività di primo livello all'interno di tale attività composita. Se un'attività costituisce la radice del flusso di lavoro, l'implementazione dell'attività è il flusso di lavoro stesso e i record di rilevamento vengono creati per le attività che formano l'implementazione. Tramite la modalità All, tutti i record di rilevamento possono essere creati per l'attività radice e tutte le relative attività composite.

Ad esempio, si supponga che MyActivity sia un'attività composita la cui implementazione contiene due attività, Activity1 e Activity2. Quando questa attività viene aggiunta a un flusso di lavoro e il rilevamento viene abilitato con un profilo di rilevamento con l'attributo implementationVisibility impostato su RootScope, i record di rilevamento vengono generati solo per MyActivity e non per le attività Activity1 e Activity2.

Tuttavia, se l'attributo implementationVisibility per il profilo di rilevamento viene impostato su All, i record di rilevamento non vengono generati solo per MyActivity, ma anche per le attività Activity1 e Activity2.

Il flag implementationVisibility si applica ai seguenti tipi di record di rilevamento:

  • ActivityStateRecord

  • FaultPropagationRecord

  • CancelRequestedRecord

  • ActivityScheduledRecord

Nota

I record CustomTrackingRecords creati dall'implementazione di attività non vengono filtrati dall'impostazione implementationVisibility.

La funzionalità implementationVisibility viene specificata come RootScope nel profilo di rilevamento nel codice come riportato di seguito:

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

La funzionalità implementationVisibility è specificata come All nel profilo di rilevamento in un file di configurazione come riportato di seguito:

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

L'impostazione ImplementationVisibility nel profilo di rilevamento è facoltativa. Per impostazione predefinita, il relativo valore è impostato su RootScope. Per i valori di questo attributo viene applicata la distinzione tra maiuscole e minuscole.

Tipi di query del profilo di rilevamento

I profili di rilevamento vengono strutturati sotto forma di sottoscrizioni dichiarative per record di rilevamento che consentono di eseguire query sulla fase di esecuzione del flusso di lavoro per record di rilevamento specifici. Sono disponibili numerosi tipi di query che consentono di sottoscrivere classi differenti di oggetti TrackingRecord. I profili di rilevamento possono essere specificati nella configurazione o tramite codice. Di seguito sono riportati i tipi di query più comuni:

  • WorkflowInstanceQuery: usare questo tipo per rilevare le modifiche del ciclo di vita dell'istanza del flusso di lavoro, ad esempio gli eventi Started e Completed dimostrati precedentemente. L'oggetto WorkflowInstanceQuery viene usato per sottoscrivere gli oggetti TrackingRecord seguenti:

    Gli stati disponibili per la sottoscrizione sono specificati nella classe WorkflowInstanceStates.

    La configurazione o il codice usato per sottoscrivere i record di rilevamento a livello di istanza del flusso di lavoro per lo stato dell'istanza Started usando l'oggetto WorkflowInstanceQuery è illustrato nell'esempio seguente.

    <workflowInstanceQueries>
        <workflowInstanceQuery>
          <states>
            <state name="Started"/>
          </states>
        </workflowInstanceQuery>
    </workflowInstanceQueries>
    
    TrackingProfile sampleTrackingProfile = new TrackingProfile()
    {
        Name = "Sample Tracking Profile",
        Queries =
        {
            new WorkflowInstanceQuery()
            {
                States = { WorkflowInstanceStates.Started}
            }
        }
    };
    
  • ActivityStateQuery: usare questo tipo per rilevare le modifiche del ciclo di vita delle attività che costituiscono un'istanza del flusso di lavoro. Ad esempio, è possibile tenere traccia di tutte le volte in cui l'attività "Invia messaggio" viene completata all'interno di un'istanza del flusso di lavoro. Questa query è necessaria affinché un oggetto TrackingParticipant sottoscriva gli oggetti ActivityStateRecord. Gli stati disponibili per la sottoscrizione sono specificati nell'oggetto ActivityStates.

    La configurazione e il codice usati per sottoscrivere i record di rilevamento dello stato dell'attività che usano l'oggetto ActivityStateQuery per l'attività SendEmailActivity sono illustrati nell'esempio seguente.

    <activityStateQueries>
      <activityStateQuery activityName="SendEmailActivity">
        <states>
          <state name="Closed"/>
        </states>
      </activityStateQuery>
    </activityStateQueries>
    
    TrackingProfile sampleTrackingProfile = new TrackingProfile()
    {
        Name = "Sample Tracking Profile",
        Queries =
        {
            new ActivityStateQuery()
            {
                ActivityName = "SendEmailActivity",
                States = { ActivityStates.Closed }
            }
        }
    };
    

    Nota

    Se più elementi activityStateQuery hanno lo stesso nome, solo gli stati nell'ultimo elemento vengono usati nel profilo di rilevamento.

  • ActivityScheduledQuery: questa query consente di rilevare un'attività pianificata per l'esecuzione da parte di un'attività padre. La query è necessaria affinché un oggetto TrackingParticipant sottoscriva gli oggetti ActivityScheduledRecord.

    La configurazione e il codice usati per sottoscrivere i record relativi all'attività figlio SendEmailActivity in fase di pianificazione tramite l'oggetto ActivityScheduledQuery sono illustrati nell'esempio seguente.

    <activityScheduledQueries>
      <activityScheduledQuery activityName="ProcessNotificationsActivity" childActivityName="SendEmailActivity" />
    </activityScheduledQueries>
    
    TrackingProfile sampleTrackingProfile = new TrackingProfile()
    {
        Name = "Sample Tracking Profile",
        Queries =
        {
            new ActivityScheduledQuery()
            {
                ActivityName = "ProcessNotificationsActivity",
                ChildActivityName = "SendEmailActivity"
            }
        }
    };
    
  • FaultPropagationQuery: usare questo tipo per rilevare la gestione degli errori che si verificano all'interno di un'attività. La query è necessaria affinché un oggetto TrackingParticipant sottoscriva gli oggetti FaultPropagationRecord.

    La configurazione e il codice usati per sottoscrivere i record relativi alla propagazione degli errori tramite l'oggetto FaultPropagationQuery sono illustrati nell'esempio seguente.

    <faultPropagationQueries>
      <faultPropagationQuery faultSourceActivityName="SendEmailActivity" faultHandlerActivityName="NotificationsFaultHandler" />
    </faultPropagationQueries>
    
    TrackingProfile sampleTrackingProfile = new TrackingProfile()
    {
        Name = "Sample Tracking Profile",
        Queries =
        {
            new FaultPropagationQuery()
            {
                FaultSourceActivityName = "SendEmailActivity",
                FaultHandlerActivityName = "NotificationsFaultHandler"
            }
        }
    };
    
  • CancelRequestedQuery: usare questo tipo per rilevare le richieste di annullamento di un'attività figlio da parte dell'attività padre. La query è necessaria affinché un oggetto TrackingParticipant sottoscriva gli oggetti CancelRequestedRecord.

    La configurazione e il codice usati per sottoscrivere i record relativi all'annullamento dell'attività tramite CancelRequestedQuery sono illustrati nell'esempio seguente.

    <cancelRequestedQueries>
      <cancelRequestedQuery activityName="ProcessNotificationsActivity" childActivityName="SendEmailActivity" />
    </cancelRequestedQueries>
    
    TrackingProfile sampleTrackingProfile = new TrackingProfile()
    {
        Name = "Sample Tracking Profile",
        Queries =
        {
            new CancelRequestedQuery()
            {
                ActivityName = "ProcessNotificationsActivity",
                ChildActivityName = "SendEmailActivity"
            }
        }
    };
    
  • CustomTrackingQuery: usare questo tipo per rilevare gli eventi definiti nelle attività del codice. La query è necessaria affinché un oggetto TrackingParticipant sottoscriva gli oggetti CustomTrackingRecord.

    La configurazione e il codice usati per sottoscrivere i record relativi ai record di rilevamento personalizzati tramite l'oggetto CustomTrackingQuery sono illustrati nell'esempio seguente.

    <customTrackingQueries>
      <customTrackingQuery name="EmailAddress" activityName="SendEmailActivity" />
    </customTrackingQueries>
    
    TrackingProfile sampleTrackingProfile = new TrackingProfile()
    {
        Name = "Sample Tracking Profile",
        Queries =
        {
            new CustomTrackingQuery()
            {
                Name = "EmailAddress",
                ActivityName = "SendEmailActivity"
            }
        }
    };
    
  • BookmarkResumptionQuery: usare questo tipo per rilevare la ripresa di un segnalibro all'interno di un'istanza del flusso di lavoro. Questa query è necessaria affinché un oggetto TrackingParticipant sottoscriva gli oggetti BookmarkResumptionRecord.

    La configurazione e il codice usati per sottoscrivere i record relativi alla ripresa del segnalibro tramite l'oggetto BookmarkResumptionQuery sono illustrati nell'esempio seguente.

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

Annotazioni

Le annotazioni consentono di contrassegnare in modo arbitrario mediante tag i record di rilevamento con un valore che può essere configurato dopo la compilazione. Ad esempio, è possibile contrassegnare diversi record di rilevamento in più flussi di lavoro con il tag "Mail Server" == "Mail Server1". Questo consente di individuare facilmente tutti i record con tale tag quando si esegue una query sui record di rilevamento in un secondo momento.

A tal fine, viene aggiunta un'annotazione a una query di rilevamento come mostrato nell'esempio seguente.

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

Come creare un profilo di rilevamento

Gli elementi della query di rilevamento vengono usati per creare un profilo di rilevamento tramite un file di configurazione XML o il codice di .NET Framework 4.6.1. Di seguito è riportato un esempio di un profilo di rilevamento creato usando un file di configurazione.

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

Avviso

Per un servizio WF in cui viene usato l'host del servizio del flusso di lavoro, il profilo di rilevamento viene generalmente creato usando un file di configurazione. È anche possibile creare un profilo di rilevamento con il codice, usando il profilo di rilevamento e l'API della query di rilevamento.

Un profilo configurato come file di configurazione XML viene applicato a un partecipante del rilevamento tramite un'estensione di comportamento. Questo profilo viene aggiunto a WorkflowServiceHost come descritto nella sezione Configurazione del rilevamento per un flusso di lavoro più avanti.

Il livello di dettaglio dei record di rilevamento creati dall'host è determinato dalle impostazioni di configurazione all'interno del profilo di rilevamento. Un partecipante del rilevamento sottoscrive i record di rilevamento aggiungendo query a un profilo di rilevamento. Per sottoscrivere tutti i record di rilevamento, il profilo di rilevamento deve specificare tutte le query di rilevamento usando "*" nei campi dei nomi di ogni query.

Di seguito sono riportati alcuni degli esempi comuni di profili di rilevamento.

  • Profilo di rilevamento per ottenere i record dell'istanza del flusso di lavoro e gli errori.

    <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>
    
  • Profilo di rilevamento per ottenere tutti i record di rilevamento personalizzati.

    <trackingProfile name="Instance_And_Custom_Records">
      <workflow activityDefinitionId="*">
        <customTrackingQueries>
          <customTrackingQuery name="*" activityName="*" />
        </customTrackingQueries>
      </workflow>
    </trackingProfile>
    

Vedi anche