Erweiterbarkeit des Workflowdiensthosts
.NET Framework 4.6.1 stellt die WorkflowServiceHost-Klasse zum Hosten von Workflowdiensten bereit. Diese Klasse wird verwendet, wenn Sie einen Workflowdienst in einer verwalteten Anwendung oder einem Windows-Dienst selbst hosten. Diese Klasse wird auch verwendet, wenn Sie einen Workflow unter Internetinformationsdienste (IIS) oder dem Windows-Prozessaktivierungsdienst (WAS) hosten. Die WorkflowServiceHost-Klasse stellt Erweiterungspunkte bereit, mit denen Sie benutzerdefinierte Erweiterungen hinzufügen, das Leerlaufverhalten ändern und andere Workflows als Dienstworkflows (die keine Messagingaktivitäten nutzen) hosten können.
Erweiterungen des Workflowdiensthosts
WorkflowServiceHost enthält eine WorkflowExtensions-Eigenschaft vom Typ WorkflowInstanceExtensionManager, der Methoden zum Hinzufügen von Erweiterungen zu WorkflowServiceHost bereitstellt. Verwenden Sie die Add-Methode zum Hinzufügen einer Erweiterung für jede Workflowdienstinstanz. Der angegebene Delegat wird aufgerufen, um eine neue Erweiterung zu erstellen, wenn eine Workflowdienstinstanz erstellt oder aus einem Persistenzspeicher geladen wird. Verwenden Sie die Add-Methode, um eine Erweiterung für jeden Workflowdiensthost hinzuzufügen. Eine Instanz der Erweiterung wird für alle Workflowdienstinstanzen genutzt.
Reagieren auf unbehandelte Ausnahmen
Das Verhalten WorkflowUnhandledExceptionBehavior ermöglicht das Angeben der Aktion, die ausgeführt werden soll, wenn innerhalb eines Workflowdiensts eine nicht behandelte Ausnahme auftritt. Die Action-Eigenschaft gibt einen der WorkflowUnhandledExceptionAction-Werte an.
Abandon – Bricht die Workflowdienstinstanz ab.
AbandonAndSuspend – Führt einen Rollback zum letzten beibehaltenen Zustand aus, und unterbricht die Ausführung der Workflowdienstinstanz. Dies ist nur der Fall, wenn der Workflow bereits mindestens einmal beibehalten wurde. Falls nicht, wird die Workflowinstanz abgebrochen.
Cancel – Bricht die Instanz ab.
Terminate – Beendet die Instanz.
Dieses Verhalten kann im Code konfiguriert werden, wie im folgenden Beispiel gezeigt.
host.Description.Behaviors.Add(new WorkflowUnhandledExceptionBehavior { Action = WorkflowUnhandledExceptionAction.Abandon });
Es kann jedoch auch in einer Konfigurationsdatei konfiguriert werden, wie im folgenden Beispiel gezeigt.
<behaviors>
<serviceBehaviors>
<behavior>
<serviceMetadata httpGetEnabled="True"/>
<serviceDebug includeExceptionDetailInFaults="False" />
<workflowUnhandledExceptionBehavior action="Abandon" />
</behavior>
</serviceBehaviors>
</behaviors>
Hosten von anderen Workflows als Dienstworkflows
Mithilfe von WorkflowServiceHost können andere Workflows als Dienstworkflows gehostet werden. Außerdem können Workflows gehostet werden, die entweder nicht mit einer Receive-Aktivität beginnen oder die keine Messagingaktivitäten verwenden. Workflowdienste beginnen normalerweise mit einer Receive-Aktivität. Wenn der WorkflowServiceHost eine Nachricht für einen Workflowdienst empfängt, wird eine neue Workflowdienstinstanz erstellt, falls diese nicht bereits ausgeführt wird (oder beibehalten wurde). Falls ein Workflow nicht mit einer Empfangsaktivität beginnt, kann er nicht mit dem Senden einer Nachricht gestartet werden, da keine Aktivität zum Empfangen der Nachricht vorhanden ist. Um einen anderen Workflow als einen Dienstworkflow zu hosten, leiten Sie eine Klasse von WorkflowHostingEndpoint ab und überschreiben OnGetInstanceId, OnGetCreationContext und OnResolveBookmark. Überschreiben Sie OnGetInstanceId, wenn Sie eine bevorzugte Instanz-ID bereitstellen möchten. Überschreiben Sie OnGetCreationContext, um einen benutzerdefinierten Workflowerstellungskontext zu erstellen oder eine Instanz des vorhandenen WorkflowCreationContext-Objekts aufzufüllen. Überschreiben Sie OnResolveBookmark, um das Lesezeichen manuell aus der eingehenden Nachricht zu extrahieren. Wenn Sie diese Methode überschreiben, müssen Sie in ihrem Text SendResponse aufrufen, um auf die an den WorkflowHostingEndpoint gesendete Nachricht zu antworten. Andernfalls wird möglicherweise der MaxConcurrentCalls-Grenzwert schließlich überschritten. In bidirektionalen Verträgen können Sie eventuell feststellen, dass der Aufruf von SendResponse fehlschlägt, weil der Client keine Antwort empfangen kann. Bei unidirektionalen Verträgen erkennen Sie eventuell erst, wenn es zu spät ist, d. h. nachdem die SendResponse-Drosselungsgrenze überschritten wurde, dass MaxConcurrentCalls nicht aufgerufen werden kann. Um eine neue Instanz eines Nicht-Dienstworkflows zu erstellen, deklarieren Sie einen Dienstvertrag, der einen Vorgang zur Erstellung einer neuen Instanz definiert. Für den Erstellungsvorgang sollte ein IDictionary<string, object> verwendet werden, um die erforderliche Workflowparameter zu übergeben. Dieser Vertrag wird implizit von der Klasse implementiert, die von WorkflowHostingEndpoint abgeleitet wurde. Fügen Sie dem Host beim Hosten des Workflows eine Instanz der von WorkflowHostingEndpoint abgeleiteten Klasse hinzu, indem Sie AddServiceEndpoint aufrufen, und rufen Sie dann Open auf. Um eine Instanz des Workflows zu erstellen, erstellen Sie für Ihren Dienstvertrag ein ChannelFactory<TChannel>-Objekt, und rufen Sie anschließend CreateChannel auf. Sie können dann den im Dienstvertrag definierten Erstellungsvorgang aufrufen.