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