Freigeben über


Erweiterbarkeit des Workflow-Host-Dienstes

.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 ein Workflow-Dienst mit Internet Information Services (IIS) oder dem Windows Process Activation Service (WAS) gehostet wird. Die WorkflowServiceHost Klasse stellt Erweiterungspunkte bereit, mit denen Sie benutzerdefinierte Erweiterungen hinzufügen, das Leerlaufverhalten ändern und Nicht-Dienst-Workflows hosten können (Workflows, die keine Messagingaktivitäten verwenden).

Erweiterungen des Workflowdiensthosts

Die WorkflowServiceHost enthält eine Eigenschaft WorkflowExtensions vom Typ WorkflowInstanceExtensionManager, die Methoden bereitstellt, um Erweiterungen zu WorkflowServiceHost hinzuzufügen. Verwenden Sie die Add Methode, um eine Erweiterung für jede Workflowdienstinstanz hinzuzufügen. 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 freigegeben.

Reagieren auf unbehandelte Ausnahmen

Auf WorkflowUnhandledExceptionBehavior diese Weise können Sie die auszuführende Aktion angeben, wenn eine unbehandelte Ausnahme innerhalb eines Workflowdiensts 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 tritt nur auf, wenn der Workflow mindestens einmal beibehalten wurde. Falls nicht, wird die Workflow-Instanz 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 });

Sie kann 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 Nicht-Service-Workflows

WorkflowServiceHost kann verwendet werden, um Nicht-Dienst-Workflows zu hosten, oder Workflows, die nicht mit einer Receive Aktivität oder Workflows beginnen, die die Messagingaktivitäten nicht 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). Wenn ein Workflow nicht mit einer Empfangsaktivität beginnt, kann er nicht gestartet werden, indem eine Nachricht gesendet wird, da keine Aktivität zum Empfangen der Nachricht vorhanden ist. Um einen dienstunabhängigen Workflow zu hosten, leiten Sie eine Klasse von WorkflowHostingEndpoint ab und überschreiben OnGetInstanceId, OnGetCreationContext und OnResolveBookmark. Überschreiben Sie OnGetInstanceId, wenn Sie eine bevorzugte Instanz-ID angeben 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. Wenn Sie dies nicht tun, kann ein MaxConcurrentCalls Grenzwert möglicherweise überschritten werden. 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 definiert, der eine neue Instanz erstellt. Der Erstellungsvorgang sollte eine IDictionary-Zeichenfolge<verwenden, ein Objekt> , um alle erforderlichen Workflowparameter zu übergeben. Dieser Vertrag wird implizit von der WorkflowHostingEndpointabgeleiteten Klasse implementiert. Fügen Sie beim Hosten des Workflows eine Instanz der WorkflowHostingEndpointabgeleiteten Klasse zum Host hinzu, indem Sie aufrufen AddServiceEndpoint und aufrufen Open. Um eine Instanz des Workflows zu erstellen, erstellen Sie für Ihren Dienstvertrag ein ChannelFactory<TChannel>-Objekt, und rufen Sie anschließend CreateChannel auf. Anschließend können Sie den in Ihrem Dienstvertrag definierten Erstellungsvorgang aufrufen.

Siehe auch