Condividi tramite


Estendibilità dell'host del servizio Workflow

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

Estensioni dell'host del servizio di flusso di lavoro

WorkflowServiceHost Contiene una WorkflowExtensions proprietà di tipo WorkflowInstanceExtensionManager che fornisce metodi per aggiungere estensioni a WorkflowServiceHost. Usare il Add metodo 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 Add metodo 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.

Reagire alle eccezioni non gestite

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

  • Abandon – Annulla l'istanza del servizio workflow.

  • AbandonAndSuspend – ripristina all'ultimo stato persistente e sospende l'istanza del servizio di workflow. Ciò si verifica solo se il flusso di lavoro è già stato memorizzato almeno una volta. Se non lo è, l'istanza del flusso di lavoro viene interrotta.

  • Cancel : annulla l'istanza.

  • Terminate : termina l'istanza.

Questo comportamento può essere configurato nel codice come illustrato nell'esempio seguente.

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

Può anche essere configurato in un file di configurazione, come illustrato 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 servizio

WorkflowServiceHost può essere usato per ospitare flussi di lavoro non di servizio o flussi di lavoro che non iniziano con un'attività Receive o flussi di lavoro che non usano le attività di messaggistica. I servizi di flusso di lavoro iniziano normalmente con un'attività Receive. WorkflowServiceHost Quando riceve un messaggio per un servizio flusso di lavoro, se non è già in esecuzione (o persistente) viene creata una nuova istanza del servizio flusso di lavoro. Se un flusso di lavoro non inizia con un'attività di ricezione, non può essere avviato inviando un messaggio perché non è presente alcuna attività per ricevere 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 OnGetInstanceId se si vuole specificare un ID istanza preferito. Sovrascrivere OnGetCreationContext per creare un contesto di creazione del flusso di lavoro personalizzato o inserire dati in un'istanza dell'oggetto esistente WorkflowCreationContext. Esegue l'override di OnResolveBookmark per estrarre manualmente il segnalibro dal messaggio in arrivo. Se si esegue l'override di questo metodo, è necessario richiamare SendResponse nel corpo in modo da rispondere al messaggio inviato a WorkflowHostingEndpoint. Se non lo fai, un MaxConcurrentCalls limite potrebbe essere eventualmente superato. Nei contratti bidirezionali, è possibile rilevare il mancato richiamo di SendResponse a causa della mancata ricezione di una risposta da parte del cliente. Nei contratti unidirezionali, potrebbe non riconoscere l'errore di non effettuare la chiamata SendResponse fino a quando non è troppo tardi, dopo il superamento del limite di restrizione MaxConcurrentCalls. Per creare una nuova istanza di un flusso di lavoro non di servizio, dichiarare un contratto di servizio che definisce un'operazione che crea una nuova istanza. L'operazione di creazione deve accettare una stringa IDictionary<, un oggetto> per passare i parametri del flusso di lavoro necessari. Questo contratto viene implementato in modo implicito dalla classe derivata da WorkflowHostingEndpoint. Quando si ospita il flusso di lavoro, aggiungere un'istanza della classe derivata da WorkflowHostingEndpoint all'host chiamando AddServiceEndpoint e Open. Per creare un'istanza del flusso di lavoro, creare un ChannelFactory<TChannel> del tipo di contratto di servizio e chiamare CreateChannel. È quindi possibile chiamare l'operazione di creazione definita nel contratto di servizio.

Vedere anche