Delen via


Uitbreidbaarheid van werkstroomservicehost

.NET Framework 4.6.1 biedt de WorkflowServiceHost klasse voor het hosten van werkstroomservices. Deze klasse wordt gebruikt wanneer u zelf een werkstroomservice host in een beheerde toepassing of een Windows-service. Deze klasse wordt ook gebruikt bij het hosten van een werkstroomservice met IIS (Internet Information Services) of Windows Process Activation Service (WAS). De WorkflowServiceHost klasse biedt uitbreidingspunten waarmee u aangepaste extensies kunt toevoegen, het niet-actieve gedrag kunt wijzigen en niet-servicewerkstromen kunt hosten (werkstromen die geen berichtenactiviteiten gebruiken).

Werkstroomservicehostextensies

De WorkflowServiceHost bevat een WorkflowExtensions eigenschap van het type WorkflowInstanceExtensionManager dat methoden biedt om extensies toe te voegen aan de WorkflowServiceHost. Gebruik de Add methode om een extensie toe te voegen voor elk exemplaar van de werkstroomservice. De opgegeven gemachtigde wordt aangeroepen om een nieuwe extensie te maken wanneer een werkstroomservice-exemplaar wordt gemaakt of geladen vanuit een persistentiearchief. Gebruik de Add methode om een extensie toe te voegen voor elke werkstroomservicehost. Er wordt één exemplaar van de extensie gedeeld voor alle werkstroomservice-exemplaren.

Reageren op niet-verwerkte uitzonderingen

Hiermee WorkflowUnhandledExceptionBehavior kunt u opgeven welke actie moet worden ondernomen als er een onverwerkte uitzondering optreedt in een werkstroomservice. De Action eigenschap geeft een van de WorkflowUnhandledExceptionAction waarden op:

  • Abandon – Hiermee wordt het exemplaar van de werkstroomservice afgebroken.

  • AbandonAndSuspend – Keert terug naar de laatst persistente status en onderbreekt het exemplaar van de werkstroomservice. Dit gebeurt alleen als de werkstroom al ten minste één keer is behouden. Als dit niet het werkstroomexemplaren is afgebroken.

  • Cancel – Annuleert het exemplaar.

  • Terminate – Beëindigt het exemplaar.

Dit gedrag kan worden geconfigureerd in code, zoals wordt weergegeven in het volgende voorbeeld.

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

Het kan ook worden geconfigureerd in een configuratiebestand, zoals wordt weergegeven in het volgende voorbeeld.

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

Niet-servicewerkstromen hosten

WorkflowServiceHost kan worden gebruikt voor het hosten van niet-servicewerkstromen of werkstromen die niet beginnen met een Receive activiteit of werkstromen die geen gebruik maken van de berichtenactiviteiten. Werkstroomservices beginnen normaal gesproken met een Receive activiteit. Wanneer het WorkflowServiceHost bericht voor een werkstroomservice wordt ontvangen, wordt er een nieuw exemplaar van de werkstroomservice gemaakt als deze nog niet wordt uitgevoerd (of persistent is). Als een werkstroom niet begint met een ontvangstactiviteit, kan deze niet worden gestart door een bericht te verzenden omdat er geen activiteit is om het bericht te ontvangen. Als u een niet-servicewerkstroom wilt hosten, moet u een klasse afleiden van WorkflowHostingEndpoint en overschrijven OnGetInstanceId, OnGetCreationContexten OnResolveBookmark. Overschrijven OnGetInstanceId als u een voorkeurs-exemplaar-id wilt opgeven. Overschrijven OnGetCreationContext om een aangepaste context voor het maken van een werkstroom te maken of een exemplaar van de bestaande WorkflowCreationContextte vullen. Overschrijven OnResolveBookmark om de bladwijzer handmatig uit het binnenkomende bericht te extraheren. Als u deze methode overschrijft, moet u in de hoofdtekst aanroepen SendResponse om te reageren op het bericht dat naar het WorkflowHostingEndpoint is verzonden. Als u dit niet doet, kan een MaxConcurrentCalls limiet uiteindelijk worden overschreden. In tweerichtingscontracten kunt u mogelijk uw fout detecteren om aan te roepen SendResponse vanwege het feit dat de client geen antwoord ontvangt. In eenrichtingscontracten kunt u de fout van het niet aanroepen SendResponse niet herkennen totdat deze te laat is, nadat de MaxConcurrentCalls beperkingslimiet is overschreden. Als u een nieuw exemplaar van een werkstroom zonder service wilt maken, declareert u een servicecontract waarmee een bewerking wordt gedefinieerd waarmee een nieuw exemplaar wordt gemaakt. De aanmaakbewerking moet een IDictionaire<tekenreeks, een object> gebruiken om de vereiste werkstroomparameters door te geven. Dit contract wordt impliciet geïmplementeerd door de WorkflowHostingEndpoint-afgeleide klasse. Wanneer u de werkstroom host, voegt u een exemplaar van de WorkflowHostingEndpoint-afgeleide klasse toe aan de host door aan te roepen en aan te roepen AddServiceEndpointOpen. Als u een exemplaar van de werkstroom wilt maken, maakt u een ChannelFactory<TChannel> van het type servicecontract en roept u het aan.CreateChannel Vervolgens kunt u de bewerking voor maken aanroepen die is gedefinieerd in uw servicecontract.

Zie ook