Estensibilità host del servizio flusso di lavoroWorkflow Service Host Extensibility

.NET Framework 4.6.1.NET Framework 4.6.1 fornisce la classe WorkflowServiceHost per ospitare i servizi flusso di lavoro. provides the WorkflowServiceHost class for hosting workflow services. Questa classe viene usata in caso di hosting automatico di un servizio flusso di lavoro in un'applicazione gestita o un servizio Windows.This class is used when you are self-hosting a workflow service in a managed application or a Windows service. 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).This class is also used when hosting a workflow service with Internet Information Services (IIS) or 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 non di servizi (ovvero che non usano attività di messaggistica).The WorkflowServiceHost class provides extension points that allow you to add custom extensions, change the idle behavior, and host non-service workflows (workflows that do not use messaging activities).

Estensioni host del servizio flusso di lavoroWorkflow Service Host Extensions

WorkflowServiceHost contiene una proprietà WorkflowExtensions di tipo WorkflowInstanceExtensionManager che fornisce un metodo per l'aggiunta di estensioni a WorkflowServiceHost.The WorkflowServiceHost contains a WorkflowExtensions property of type WorkflowInstanceExtensionManager that provides methods to add extensions to the WorkflowServiceHost. Usare il metodo Add per aggiungere un'estensione per ogni istanza del servizio flusso di lavoro.Use the Add method to add an extension for each workflow service instance. 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.The delegate specified is called to create a new extension when a workflow service instance is created or loaded from a persistence store. 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.Use the Add method to add an extension for each workflow service host, one instance of the extension is shared for all workflow service instances.

Reazione alle eccezioni non gestiteReact to Unhandled Exceptions

WorkflowUnhandledExceptionBehavior consente di specificare l'azione da eseguire quando si verifica un'eccezione non gestita in un servizio flusso di lavoro.The WorkflowUnhandledExceptionBehavior enables you to specify the action to take if an unhandled exception occurs within a workflow service. La proprietà Action specifica uno dei valori WorkflowUnhandledExceptionAction:The Action property specifies one of the WorkflowUnhandledExceptionAction values:

  • Abandon - Interrompe l'istanza del servizio flusso di lavoro.Abandon – Aborts the workflow service instance.

  • AbandonAndSuspend - Esegue il rollback all'ultimo stato persistente e sospende l'istanza del servizio flusso di lavoro.AbandonAndSuspend – Rolls back to the last persisted state and suspends the workflow service instance. Questo caso si verifica solo se il flusso di lavoro è già stato reso persistente almeno una volta.This only occurs if the workflow has already been persisted at least once. In caso contrario, l'istanza del flusso di lavoro viene interrotta.If not the workflow instance is aborted.

  • Cancel - Annulla l'istanza.Cancel – Cancels the instance.

  • Terminate - Termina l'istanza.Terminate – Terminates the instance.

È possibile configurare questo comportamento nel codice, come indicato nell'esempio seguente.This behavior can be configured in code as shown in the following example.

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

È inoltre possibile configurarlo in un file di configurazione, come indicato nell'esempio seguente.It can also be configured in a configuration file as shown in the following example.

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

Hosting di flussi di lavoro non di serviziHosting Non-Service Workflows

È 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.WorkflowServiceHost can be used to host non-service workflows, or workflows that either do not begin with a Receive activity or workflows that do not use the messaging activities. I servizi flusso di lavoro iniziano in genere con un'attività Receive.Workflow services normally begin with a Receive activity. 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).When the WorkflowServiceHost receives a message for a workflow service, if it is not already running (or persisted) a new workflow service instance is created. 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.If a workflow does not begin with a Receive activity, it cannot be started by sending a message because there is no activity to receive the message. Per ospitare un flusso di lavoro non di servizio, derivare una classe da WorkflowHostingEndpoint ed eseguire l'override di OnGetInstanceId, OnGetCreationContext e OnResolveBookmark.To host a non-service workflow, derive a class from WorkflowHostingEndpoint and override OnGetInstanceId, OnGetCreationContext, and OnResolveBookmark. Eseguire l'override di OnGetInstanceId se si desidera fornire un ID istanza preferito.Override OnGetInstanceId if you want to provide a preferred instance ID. Eseguire l'override di OnGetCreationContext per creare un contesto di creazione di flusso di lavoro personalizzato o popolare un'istanza dell'elemento WorkflowCreationContext esistente.Override OnGetCreationContext to create a custom workflow creation context or populate an instance of the existing WorkflowCreationContext. Eseguire l'override di OnResolveBookmark per estrarre manualmente il segnalibro dal messaggio in ingresso.Override OnResolveBookmark to manually extract the bookmark from the incoming message. Se si esegue l'override di questo metodo, è necessario richiamare SendResponse dal corpo del metodo per rispondere al messaggio inviato a WorkflowHostingEndpoint.If you override this method, you must invoke SendResponse in its body so as to respond to the message sent to the WorkflowHostingEndpoint. In caso contrario, potrebbe venire superato il limite MaxConcurrentCalls.If you do not do so, a MaxConcurrentCalls limit may be eventually exceeded. Nei contratti bidirezionali, potrebbe rilevarsi l'impossibilità di richiamare SendResponse in quanto il client non è in grado di ricevere una risposta.In two-way contracts, you may be able to detect your failure to invoke SendResponse because of the client’s failure to receive a response. 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.In one-way contracts, you may not recognize the mistake of failing to call SendResponse until it’s too late, after the MaxConcurrentCalls throttle limit is exceeded. Per ulteriori informazioni, vedere il segnalibro di ripresa WorkflowHostingEndpointper creare una nuova istanza del flusso di lavoro non di servizio, dichiarare un contratto di servizio che definisce un'operazione che crea una nuova istanza.For more information, please see the WorkflowHostingEndpoint Resume BookmarkTo create a new instance of a non-service workflow, declare a service contract that defines an operation that creates a new instance. L'operazione di creazione deve usare un elemento IDictionary<stringa, oggetto > per passare qualsiasi necessarie parametri flusso di lavoro.The creation operation should take an IDictionary<string, object> to pass any required workflow parameters. Questo contratto viene implementato in modo implicito dalla classe derivata da WorkflowHostingEndpoint.This contract is implicitly implemented by the WorkflowHostingEndpoint-derived class. Quando si ospita il flusso di lavoro, aggiungere un'istanza di WorkflowHostingEndpoint-derivata all'host chiamando AddServiceEndpoint e chiamare System.ServiceModel.Activities.WorkflowServiceHost.Open.When hosting the workflow, add an instance of the WorkflowHostingEndpoint-derived class to the host by calling AddServiceEndpoint and call System.ServiceModel.Activities.WorkflowServiceHost.Open. Per creare un'istanza del flusso di lavoro, creare un elemento ChannelFactory<TChannel> del tipo di contratto di servizio e chiamare CreateChannel.To create an instance of the workflow, create a ChannelFactory<TChannel> of your service contract type and call CreateChannel. È quindi possibile chiamare l'operazione di creazione definita nel contratto di servizio.You can then call the create operation defined in your service contract.

Vedere ancheSee Also

Servizi flusso di lavoroWorkflow Services
Attività di messaggisticaMessaging Activities