Windows Workflow Foundation i WCF

Jak wiadomo diagramy w WF można wystawić jako usługi sieciowe (web service). Oczywiście musi spełniać warunek następujący: początek diagramu musi zawierać kontrolkę WebServiceInput a na "wyjściu" diagramu musi być kontrolka WebServiceOutput. Standardowy mechanizm publikacji tworzony prosta usługę (asmx). A co w przypadku gdy chcemy mieć większą kontrole nad usługą? Taką kontrole daje nam WCF. W tym momencie trzeba zrobić własny sposób publikacji.
Musimy zdefiniować interfejs oraz opatrzyć atrybutami tak jakbyśmy robili usługę WCF

[ServiceContract()]
interface IKeyValidator
{
[OperationContract(Name = "ValidateKey")]
string ValidateKey(string key);
}

Następnie tworzymy sobie diagram. Ja przygotowałem następujący (pomijam opis jak go poprawnie skonfigurować w oparciu o powyższy interfejs i własne akcje)



WF jest uruchamiany poprzez klase WorkflowWebService która implementuje tworzenie środowiska WF, przygotowanie diagramu, uruchomienie go, przekazanie parametrów do diagramu oraz pobranie z niego wartości zwrotnej. Musimy utworzyć własna klasę która będzie dziedziczyć z tej klasy oraz interfejsu naszej usługi.

[AspNetCompatibilityRequirements(RequirementsMode = AspNetCompatibilityRequirementsMode.Required)]
public class KeyValidatorService : WorkflowWebService, IKeyValidator
{
public KeyValidatorService()
: base(typeof(Workflow1))
{
}
public string ValidateKey(string key)
{
return (string)base.Invoke(typeof(IKeyValidator), "ValidateKey", true, new object[] { key })[0];
}
}

Cały mechanizm uruchamiający diagram jest to wywołanie metody Invoke gdzie parametrami są typ interfejsu usługi sieciowej, nazwa metody którą wywołujemy, flaga oznaczająca czy usługa aktywuje diagram oraz tablica parametrów która jest przykazywana do diagramu.
Klasa WorkflowWebService niestety wymaga środowiska ASP.NET to poprawnego działania stąd dodatkowy atrybut AspNetCompatibilityRequirements na klasie KeyValidatorService. Teraz możemy przygotować aplikacje webową oraz utworzyć plik dla usługi sieciowej która może wyglądać tak

<%@ ServiceHost Language="C#" Service="WebServiceTest.KeyValidatorService" %>

Musimy jeszcze przygotować plik konfiguracyjny aplikacji webowej. Poniżej fragmenty konfiguracji które należy wstawić do web.config aby móc hostować diagramy WF

<configuration>
<configSections>
<section name="WorkflowRuntime" type="System.Workflow.Runtime.Configuration.WorkflowRuntimeSection, System.Workflow.Runtime, Version=3.0.00000.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
</configSections>
<WorkflowRuntime Name="WorkflowServiceContainer">
<Services>
<add type="System.Workflow.Runtime.Hosting.ManualWorkflowSchedulerService, System.Workflow.Runtime, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
<add type="System.Workflow.Runtime.Hosting.DefaultWorkflowCommitWorkBatchService, System.Workflow.Runtime, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35"/>
</Services>
</WorkflowRuntime>
<system.web>
<httpModules>
<add type="System.Workflow.Runtime.Hosting.WorkflowWebHostingModule, System.Workflow.Runtime, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35" name="WorkflowHost"/>
</httpModules>
</system.web>
<system.serviceModel>
<serviceHostingEnvironment aspNetCompatibilityEnabled="true" />
<system.serviceModel>
</configuration>

Przygotowałem też mały program testowy napisany w WPF




Kompletny przykład jest dostępny tutaj WFWebService.zip

0 komentarze:

Prześlij komentarz