Estensibilità host del servizio flusso di lavoro

.NET Framework 4.6.1 fornisce la classe WorkflowServiceHost per ospitare i servizi flusso di lavoro. Questa classe viene usata in caso di hosting automatico di un servizio flusso di lavoro in un'applicazione gestita o un servizio Windows. La classe viene inoltre usata quando si ospita un servizio flusso di lavoro con IIS (Internet Information Services) o con il servizio Attivazione Processo Windows (WAS, Windows Process Activation Service). La classe WorkflowServiceHost fornisce punti di estensione che consentono di aggiungere estensioni personalizzate, modificare il comportamento inattivo e ospitare flussi di lavoro non di servizi (ovvero che non usano attività di messaggistica).

Estensioni host del servizio flusso di lavoro

WorkflowServiceHost contiene una proprietà WorkflowExtensions di tipo WorkflowInstanceExtensionManager che fornisce un metodo per l'aggiunta di estensioni a WorkflowServiceHost. Usare il metodo Add per aggiungere un'estensione per ogni istanza del servizio flusso di lavoro. Il delegato specificato viene chiamato per creare una nuova estensione quando un'istanza del servizio flusso di lavoro viene creata o caricata da un archivio di persistenza. Usare il metodo Add per aggiungere un'estensione per ogni host del servizio flusso di lavoro. Un'istanza dell'estensione viene condivisa per tutte le istanze del servizio flusso di lavoro.

Reazione alle eccezioni non gestite

WorkflowUnhandledExceptionBehavior consente di specificare l'azione da eseguire quando si verifica un'eccezione non gestita in un servizio flusso di lavoro. La proprietà Action specifica uno dei valori WorkflowUnhandledExceptionAction:

  • Abandon - Interrompe l'istanza del servizio flusso di lavoro.

  • AbandonAndSuspend - Esegue il rollback all'ultimo stato persistente e sospende l'istanza del servizio flusso di lavoro. Questo caso si verifica solo se il flusso di lavoro è già stato reso persistente almeno una volta. In caso contrario, l'istanza del flusso di lavoro viene interrotta.

  • Cancel - Annulla l'istanza.

  • Terminate - Termina l'istanza.

È possibile configurare questo comportamento nel codice, come indicato nell'esempio seguente.

host.Description.Behaviors.Add(new WorkflowUnhandledExceptionBehavior { Action = WorkflowUnhandledExceptionAction.Abandon });

È inoltre possibile configurarlo in un file di configurazione, come indicato nell'esempio seguente.

<behaviors>
      <serviceBehaviors>
        <behavior>
          <serviceMetadata httpGetEnabled="True"/>
          <serviceDebug includeExceptionDetailInFaults="False" />
          <workflowUnhandledExceptionBehavior action="Abandon" />
        </behavior>
      </serviceBehaviors>
</behaviors>

Hosting di flussi di lavoro non di servizi

È possibile usare WorkflowServiceHost per ospitare flussi di lavoro non di servizi, che non iniziano con un'attività Receive o che non usano le attività di messaggistica. I servizi flusso di lavoro iniziano in genere con un'attività Receive. Se WorkflowServiceHost riceve un messaggio per un servizio flusso di lavoro, viene creata una nuova istanza del servizio flusso di lavoro (se non è già in esecuzione o non è stata già resa persistente). Se un flusso di lavoro non inizia con un'attività Receive, non può essere avviato inviando un messaggio, poiché non è presente alcuna attività che riceva il messaggio. Per ospitare un flusso di lavoro non di servizio, derivare una classe da WorkflowHostingEndpoint ed eseguire l'override di OnGetInstanceId, OnGetCreationContext e OnResolveBookmark. Eseguire l'override di OnGetInstanceId se si desidera fornire un ID istanza preferito. Eseguire l'override di OnGetCreationContext per creare un contesto di creazione di flusso di lavoro personalizzato o popolare un'istanza dell'elemento WorkflowCreationContext esistente. Eseguire l'override di OnResolveBookmark per estrarre manualmente il segnalibro dal messaggio in ingresso. Se si esegue l'override di questo metodo, è necessario richiamare SendResponse dal corpo del metodo per rispondere al messaggio inviato a WorkflowHostingEndpoint. In caso contrario, potrebbe venire superato il limite MaxConcurrentCalls. Nei contratti bidirezionali, potrebbe rilevarsi l'impossibilità di richiamare SendResponse in quanto il client non è in grado di ricevere una risposta. Nei contratti unidirezionali è invece possibile che non si riesca a rilevare l'impossibilità di richiamare SendResponse se non troppo tardi, dopo che il limite MaxConcurrentCalls è stato superato. Per creare una nuova istanza di un flusso di lavoro non di servizio, dichiarare un contratto di servizio che definisce un'operazione in grado di creare una nuova istanza. L'operazione di creazione deve usare un elemento IDictionary<stringa, oggetto> per passare qualsiasi parametro di flusso di lavoro obbligatorio. Questo contratto viene implementato in modo implicito dalla classe derivata da WorkflowHostingEndpoint. In fase di hosting del flusso di lavoro, aggiungere un'istanza della classe derivata da WorkflowHostingEndpoint all'host chiamando AddServiceEndpoint e chiamare Open. Per creare un'istanza del flusso di lavoro, creare un elemento ChannelFactory<TChannel> del tipo di contratto di servizio e chiamare CreateChannel. È quindi possibile chiamare l'operazione di creazione definita nel contratto di servizio.

Vedi anche