Overzicht van werkstroomservices
Werkstroomservices zijn wcF-services die worden geïmplementeerd met behulp van werkstromen. Werkstroomservices zijn werkstromen die gebruikmaken van de berichtenactiviteiten voor het verzenden en ontvangen van WCF-berichten (Windows Communication Foundation). .NET Framework 4.5 introduceert een aantal berichtenactiviteiten waarmee u berichten vanuit een werkstroom kunt verzenden en ontvangen. Zie Berichtenactiviteiten voor meer informatie over berichtenactiviteiten en hoe ze kunnen worden gebruikt om verschillende patronen voor berichtuitwisseling te implementeren.
Voordelen van het gebruik van werkstroomservices
Naarmate toepassingen steeds meer worden gedistribueerd, worden afzonderlijke services verantwoordelijk voor het aanroepen van andere services om een deel van het werk te offloaden. Het implementeren van deze aanroepen als asynchrone bewerkingen introduceert enige complexiteit in de code. Foutafhandeling voegt extra complexiteit toe in de vorm van het verwerken van uitzonderingen en het verstrekken van gedetailleerde traceringsinformatie. Sommige services zijn vaak lang actief en kunnen waardevolle systeemresources in beslag nemen terwijl ze wachten op invoer. Vanwege deze problemen zijn gedistribueerde toepassingen vaak erg complex en moeilijk te schrijven en te onderhouden. Werkstromen zijn een natuurlijke manier om de coördinatie van asynchroon werk uit te drukken, met name aanroepen naar externe services. Werkstromen zijn ook effectief bij het vertegenwoordigen van langlopende bedrijfsprocessen. Het zijn deze kwaliteiten die de werkstroom een uitstekende asset maken voor het bouwen van services in een gedistribueerde omgeving.
Een werkstroomservice implementeren
Bij het implementeren van een WCF-service definieert u een aantal contracten waarin de service en de gegevens worden beschreven die worden verzonden en ontvangen. De gegevens worden weergegeven als gegevenscontracten en berichtcontracten. Zowel WCF- als werkstroomservices gebruiken gegevenscontract- en berichtcontractdefinities als onderdeel van servicebeschrijvingen. De service zelf toont metagegevens (in de vorm van WSDL) om de bewerkingen van de service te beschrijven. In WCF definiëren servicecontracten en bewerkingscontracten de service en de bewerkingen die worden ondersteund. In een werkstroomservice maken deze contracten echter deel uit van het bedrijfsproces zelf. Ze worden weergegeven in metagegevens door een proces dat contractdeductie wordt genoemd. Wanneer een werkstroomservice wordt gehost met behulp WorkflowServiceHostvan, wordt de werkstroomdefinitie onderzocht en wordt er een contract gegenereerd op basis van de set berichtenactiviteiten in de werkstroom. Met name worden de volgende activiteiten en eigenschappen gebruikt om het contract te genereren:
Receive-activiteit
SendReply-activiteit
TransactedReceiveScope-activiteit
Het eindresultaat van contractdeductie is een beschrijving van de service met behulp van dezelfde gegevensstructuren als WCF-services en operationele contracten. Deze informatie wordt vervolgens gebruikt om WSDL beschikbaar te maken voor de werkstroomservice.
Notitie
Met .NET Framework 4.6.1 kunt u geen werkstroomservices schrijven met behulp van een bestaande contractdefinitie zonder extra ondersteuning voor hulpprogramma's. Werkstroomservicecontracten worden gemaakt door het contractdeductieproces dat eerder is besproken. Berichtcontracten en gegevenscontracten worden echter volledig ondersteund.
Werkstroomservices en op MSMQ gebaseerde bindingen
WCF definieert twee op MSMQ gebaseerde bindingen NetMsmqBinding en MsmqIntegrationBinding. Op MSMQ gebaseerde bindingen worden vaak gebruikt met werkstroomservices vanwege de langdurige aard van dergelijke services. De op MSMQ gebaseerde bindingen hebben een ValidityDuration
eigenschap die aangeeft hoe lang MSMQ-berichten kunnen worden verondersteld geldig te zijn. Vanwege de langdurige aard van werkstroomservices is het mogelijk dat de geldigheidsduur van een MSMQ-bericht kan verlopen voordat de werkstroomservice dit kan verwerken. Het is daarom erg belangrijk om de geldigheidsduur van een MSMQ-binding in te stellen op een geschikte waarde. Deze waarde moet worden gekozen op basis van de werkstroom en hoe berichten worden verwerkt. Als u bijvoorbeeld een werkstroom hebt met een Receive activiteit gevolgd door een aangepaste activiteit die 10 minuten duurt, gevolgd door een andere Receive activiteit, is de juiste waarde ValidityDuration
groter dan 10 minuten.
Een werkstroomservice hosten
Net als WCF-services moeten werkstroomservices worden gehost. WCF-services gebruiken de klasse voor het ServiceHost hosten van services en werkstroomservices WorkflowServiceHost voor het hosten van services. Net als WCF-services kunnen werkstroomservices op verschillende manieren worden gehost, bijvoorbeeld:
In een beheerde .NET Framework-toepassing.
In Internet Information Services (IIS).
In Windows Process Activation Service (WAS).
In een beheerde Windows-service.
Werkstroomservices die worden gehost in een beheerde .NET Framework-toepassing of een beheerde Windows-service maken een exemplaar van de WorkflowServiceHost klasse en geven dit door aan een exemplaar van de WorkflowService werkstroomdefinitie binnen de Body eigenschap. Een werkstroomdefinitie die berichtenactiviteiten bevat, wordt weergegeven als een werkstroomservice.
Als u een werkstroomservice in IIS of WAS wilt hosten, plaatst u het xamlx-bestand dat de definitie van de werkstroomservice bevat in een virtuele map. Er wordt automatisch een standaardeindpunt (met behulp van BasicHttpBinding) gemaakt voor meer informatie. Zie Vereenvoudigde configuratie. U kunt ook een Web.config-bestand in de virtuele map plaatsen om uw eigen eindpunten op te geven. Als uw werkstroomdefinitie zich in een assembly bevindt, kunt u een .svc-bestand in de virtuele map en de werkstroomassembly in de App_Code map plaatsen. Het .svc-bestand moet de servicehostfactory en de klasse opgeven waarmee de werkstroomservice wordt geïmplementeerd. In het volgende voorbeeld ziet u hoe u de servicehostfactory opgeeft en de klasse opgeeft die de werkstroomservice implementeert.
<%@ServiceHost Factory="System.ServiceModel.Activities.Activation.WorkflowServiceHostFactory"
Service="EchoService"%>