Sdílet prostřednictvím


Rozšiřitelnost hostu služby pracovního postupu

.NET Framework 4.6.1 poskytuje WorkflowServiceHost třídu pro hostování workflow služeb. Tato třída se používá, když sami hostujete službu pracovního postupu ve spravované aplikaci nebo službě systému Windows. Tato třída se používá také při hostování služby pracovního postupu pomocí internetové informační služby (IIS) nebo služby aktivace procesu systému Windows (WAS). Třída WorkflowServiceHost poskytuje rozšiřující body, které umožňují přidávat vlastní rozšíření, měnit chování nečinnosti a hostovat pracovní postupy mimo službu (pracovní postupy, které nepoužívají aktivity zasílání zpráv).

Rozšíření hostitele služby workflowu

Obsahuje WorkflowServiceHost vlastnost WorkflowExtensions typu WorkflowInstanceExtensionManager která poskytuje metody pro přidání rozšíření k WorkflowServiceHost. Tuto metodu Add použijte k přidání rozšíření pro každou instanci služby pracovního postupu. Když je vytvořena nebo načtena výkonnostní instance workflow služby z datového úložiště, vyzvaný delegát je pověřen vytvořením nového rozšíření. Tuto metodu Add použijte k přidání rozšíření pro každého hostitele služby pracovního postupu, jedna instance rozšíření je sdílena pro všechny instance služby pracovního postupu.

Reakce na neošetřené výjimky

Funkce WorkflowUnhandledExceptionBehavior umožňuje určit akci, kterou je třeba provést, pokud dojde k neošetřené výjimce ve službě pracovního postupu. Vlastnost Action určuje jednu z WorkflowUnhandledExceptionAction hodnot:

  • Abandon – Přeruší instanci služby workflowu.

  • AbandonAndSuspend – Vrátí zpět poslední trvalý stav a pozastaví instanci služby pracovního postupu. K tomu dochází pouze v případě, že pracovní postup již byl alespoň jednou zachován. Pokud není instance pracovního postupu přerušena.

  • Cancel – Zruší instanci.

  • Terminate – Ukončí instanci.

Toto chování lze nakonfigurovat v kódu, jak je znázorněno v následujícím příkladu.

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

Dá se také nakonfigurovat v konfiguračním souboru, jak je znázorněno v následujícím příkladu.

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

Hostování pracovních postupů mimo službu

WorkflowServiceHost lze použít k hostování neslužných pracovních postupů nebo pracovních postupů, které nezačínají aktivitou Receive nebo pracovními postupy, které nepoužívají aktivity zasílání zpráv. Služby pracovních postupů obvykle začínají aktivitou Receive . Když WorkflowServiceHost obdrží zprávu pro službu pracovního postupu, pokud ještě není spuštěná (nebo uložená), vytvoří se nová instance služby pracovního postupu. Pokud pracovní postup nezačíná aktivitou příjmu, nelze ji spustit odesláním zprávy, protože zprávu nelze přijmout žádnou aktivitou. Chcete-li hostovat pracovní postup mimo službu, odvodit třídu z WorkflowHostingEndpoint a přepsat OnGetInstanceId, OnGetCreationContext a OnResolveBookmark. Pokud chcete zadat ID upřednostňované instance, přepište ho OnGetInstanceId. Přepište OnGetCreationContext pro vytvoření vlastního kontextu pracovního postupu nebo naplnění instance již existujícího WorkflowCreationContext. Nastavte OnResolveBookmark pro ruční extrakci záložky z příchozí zprávy. Pokud tuto metodu přepíšete, musíte vyvolat SendResponse v těle metody, aby reagovala na zprávu poslanou do WorkflowHostingEndpoint. Pokud to neuděláte, může dojít k překročení limitu MaxConcurrentCalls . V obousměrných smlouvách možná budete moct zjistit, že se nepodařilo vyvolat SendResponse, protože klient neobdržel odpověď. V jednostranných smlouvách možná nerozpoznáte chybu selhání zavolat SendResponse dokud není příliš pozdě, až po překročení MaxConcurrentCalls limitu. Chcete-li vytvořit novou instanci pracovního postupu mimo službu, deklarujte kontrakt služby, který definuje operaci, která vytvoří novou instanci. Operace vytvoření by měla mít řetězec IDictionary<, objekt> pro předání požadovaných parametrů pracovního postupu. Tento kontrakt je implicitně implementován WorkflowHostingEndpoint odvozenou třídou. Při hostování pracovního postupu přidejte do hostitele instanci třídy odvozené od WorkflowHostingEndpoint voláním AddServiceEndpoint a Open. Chcete-li vytvořit instanci pracovního postupu, vytvořte ChannelFactory<TChannel> podle typu kontraktu vaší služby a volejte CreateChannel. Poté můžete zavolat operaci vytvoření definovanou ve vaší smlouvě o službě.

Viz také