Contract First Workflow Service Development
Starting with .NET Framework 4.5, Windows Workflow Foundation (WF) features better integration between web services and workflows in the form of contract-first workflow development. The contract-first workflow development tool allows you to design the contract in code first. The tool then automatically generates an activity template in the toolbox for the operations in the contract. This topic provides an overview of how the activities and properties in a workflow service map to the attributes of a service contract. For a step-by-step example of creating a contract-first workflow service, see How to: Create a workflow service that consumes an existing service contract.
In this topic
Mapping service contract attributes to workflow attributes
The tables in the following sections specify the different WCF attributes and properties and how they are mapped to the messaging activities and properties in a contract-first workflow.
Service Contract Attributes
Property Name | Supported | Description | WF Validation |
---|---|---|---|
CallbackContract | No | Gets or sets the type of callback contract when the contract is a duplex contract. | (N/A) |
ConfigurationName | No | Gets or sets the name used to locate the service in an application configuration file. | (N/A) |
HasProtectionLevel | Yes | Gets a value that indicates whether the member has a protection level assigned. | Receive.ProtectionLevel should not be null. |
Name | Yes | Gets or sets the name for the <portType> element in Web Services Description Language (WSDL). | Receive.ServiceContractName.LocalName should match. |
Namespace | Yes | Gets or sets the namespace of the <portType> element in Web Services Description Language (WSDL). | Receive.ServiceContractName.NameSpace should match |
ProtectionLevel | Yes | Specifies whether the binding for the contract must support the value of the ProtectionLevel property. | Receive.ProtectionLevel should match. |
SessionMode | No | Gets or sets whether sessions are allowed, not allowed or required. | (N/A) |
TypeId | No | When implemented in a derived class, gets a unique identifier for this Attribute. (Inherited from Attribute.) | (N/A) |
Insert subsection body here.
Operation Contract Attributes
Property Name | Supported | Description | WF Validation |
---|---|---|---|
Action | Yes | Gets or sets the WS-Addressing action of the request message. | Receive.Action should match. |
AsyncPattern | No | Indicates that an operation is implemented asynchronously using a Begin<methodName> and End<methodName> method pair in a service contract. | (N/A) |
HasProtectionLevel | Yes | Gets a value that indicates whether the messages for this operation must be encrypted, signed, or both. | Receive.ProtectionLevel should not be null. |
IsInitiating | No | Gets or sets a value that indicates whether the method implements an operation that can initiate a session on the server(if such a session exists). | (N/A) |
IsOneWay | Yes | Gets or sets a value that indicates whether an operation returns a reply message. | (No SendReply for this Receive OR no ReceiveReply for this Send). |
IsTerminating | No | Gets or sets a value that indicates whether the service operation causes the server to close the session after the reply message, if any, is sent. | (N/A) |
Name | Yes | Gets or sets the name of the operation. | Receive.OperationName should match. |
ProtectionLevel | Yes | Gets or sets a value that specifies whether the messages of an operation must be encrypted, signed, or both. | Receive.ProtectionLevel should match. |
ReplyAction | Yes | Gets or sets the value of the SOAP action for the reply message of the operation. | SendReply.Action should match. |
TypeId | No | When implemented in a derived class, gets a unique identifier for this Attribute. (Inherited from Attribute.) | (N/A) |
Message Contract Attributes
Property Name | Supported | Description | WF Validation |
---|---|---|---|
HasProtectionLevel | Yes | Gets a value that indicates whether the message has a protection level. | No validation (Receive.Content and SendReply.Content must match the message contract type). |
IsWrapped | Yes | Gets or sets a value that specifies whether the message body has a wrapper element. | No validation (Receive.Content and Sendreply.Content must match the message contract type). |
ProtectionLevel | No | Gets or sets a value that specified whether the message must be encrypted, signed, or both. | (N/A) |
TypeId | Yes | When implemented in a derived class, gets a unique identifier for this Attribute. (Inherited from Attribute.) | No validation (Receive.Content and SendReply.Content must match the message contract type). |
WrapperName | Yes | Gets or sets the name of the wrapper element of the message body. | No validation (Receive.Content and SendReply.Content must match the message contract type). |
WrapperNamespace | No | Gets or sets the namespace of the message body wrapper element. | (N/A) |
Data Contract Attributes
Property Name | Supported | Description | WF Validation |
---|---|---|---|
IsReference | No | Gets or sets a value that indicates whether to preserve object reference data. | (N/A) |
Name | Yes | Gets or sets the name of the data contract for the type. | No validation (Receive.Content and SendReply.Content must match the message contract type). |
Namespace | Yes | Gets or sets the namespace for the data contract for the type. | No validation (Receive.Content and SendReply.Content must match the message contract type). |
TypeId | No | When implemented in a derived class, gets a unique identifier for this Attribute. (Inherited from Attribute.) | (N/A) |
Fault Contract Attributes
Property Name | Supported | Description | WF Validation |
---|---|---|---|
Action | Yes | Gets or sets the action of the SOAP fault message that is specified as part of the operation contract. | SendReply.Action should match. |
DetailType | Yes | Gets the type of a serializable object that contains error information. | SendReply.Content should match the type |
HasProtectionLevel | No | Gets a value that indicates whether the SOAP fault message has a protection level assigned. | (N/A) |
Name | No | Gets or sets the name of the fault message in Web Services Description Language (WSDL). | (N/A) |
Namespace | No | Gets or sets the namespace of the SOAP fault. | (N/A) |
ProtectionLevel | No | Specifies the level of protection the SOAP fault requires from the binding. | (N/A) |
TypeId | No | When implemented in a derived class, gets a unique identifier for this Attribute. (Inherited from Attribute.) | (N/A) |
Additional Support and Implementation Information
Unsupported service contract features
Use of TPL (Task Parallel Library) Tasks in contracts is not supported.
Inheritance in Service Contracts is not supported.
Generation of configured messaging activities
Two public static methods are added to the Receive and SendReply activities to support the generation of pre-configured message activities when using contract-first workflow services.
The activity generated by these methods should pass contract validation, and therefore these methods are used internally as part of the validation logic for Receive and SendReply. The OperationName, ServiceContractName, Action, SerializerOption, ProtectionLevel, and KnownTypes are all pre-configured to match the imported contract. In the content properties page for the activities in the workflow designer, the Message or Parameters sections are also pre-configured to match the contract.
WCF fault contracts are also handled by returning a separate set of configured SendReply activities for each of the faults that show up in the Faults FaultDescriptionCollection.
For other parts of OperationDescription that are unsupported by WF services today (e.g. WebGet/WebInvoke behaviors, or custom operation behaviors), the API will ignore those values as part of the generation and configuration. No exceptions will be thrown.