Professional Documents
Culture Documents
Visual Studio® 2008: Windows® Communication Foundation
Visual Studio® 2008: Windows® Communication Foundation
Windows®
Communication
Foundation
Module 5: Designing and Defining Contracts
• Designing a Coherent and Cohesive WCF Service Interface
Coherent
Consistent
Parameters
Operations
in and out
Designed for
distribution
Client
Service
Withdraw
WithdrawResponse
Consists of
SOAP Message
Defines Namespace
Unique method
ContractName address on
this service
Defines OperationName
Contracts and Message Contents
No funds
exception SOAP
SOAP
Message Message
Response Request
Message Message
Error
Message
Contracts and Message Handling
Client Service
Client
Service
One-Way
Client
Service
Duplex
Contracts and Versioning
• Service Names
• Service Namespaces
• Contract Implementation
Name
Namespace
CallbackContract
ConfigurationName
SessionMode
Service Names
[ServiceContract(Name="BankingService")]
public interface IBank
{
…
}
[ServiceContract(ConfigurationName=“TheBankService")]
public interface IBank
{
… <services>
} <service name=“TheBankService">
...
</services>
Service Namespaces
[ServiceContract(Namespace="http://myuri.org/Simple")]
public interface IBank
{
[OperationContract]
decimal GetBalance(string account);
...
<s:Header>
<Action s:mustUnderstand="1"
xmlns="http://schemas.microsoft.com/ws/2005/05/addressing/none">
http://myuri.org/Simple/IBank/GetBalance
</Action>
</s:Header>
...
<s:Body>
<GetBalance xmlns="http://myuri.org/Simple">
...
</s:Body>
Contract Implementation
Should be separate
Must have from contract
a parameterless definition
constructor
• Operation Overloading
• One-Way Operations
Name
Action ActionReply
IsOneWay
[ServiceContract(Namespace="http://myuri.org/Simple")]
public interface IBank
{
[OperationContract]
decimal GetBalance(string account);
...
Operation Contracts and Names
[OperationContract(Name="CustomerBalance“)]
decimal GetBalance(string account);
[OperationContract(Action="http://myuri.org/BankBalanceRequest"
ReplyAction="http://myuri.org/BankBalanceResponse“)]
decimal GetBalance(string account);
[OperationContract]
void Deposit(string account, decimal amount);
[OperationContract]
void Deposit(string account, Currency amount);
[OperationContract(Name="DepositLocalCurrency"]
void Deposit(string account, decimal amount);
[OperationContract(Name="DepositAnyCurrency")]
void Deposit(string account, Currency amount);
Client code
[OperationContract(IsOneWay=true)]
void MakeDeposit(string account, decimal amount);
Benefits in performance
Defining Duplex Contracts
Client Service contract
Service
Callback contract
[ServiceContract(CallbackContract=typeof(ITransferAck))]
public interface IBankTransfer
{
[OperationContract(IsOneWay=true)]
void ExchangeTransferRecord(int transferId, string record);
}
public interface ITransferAck
{
[OperationContract(IsOneWay=true)]
void TransferRecordResendRequest(int transferId);
}
client = OperationContext.Current.GetCallbackChannel<ITransferAck>();
Demonstration: One-Way Operations and Callbacks
In this demonstration, you will see how to:
• Define and implement a one-way operation
account Body
amount account
amount
Primitive types
Simple types
Any other
complex type
XML-based types requires a
data contract
Collections
Enumerations
Defining a Data Contract
DataContractAttribute
on class
[DataContract]
public class TransferRecord
{
[DataMember] Visibility
public string targetAccount; irrelevant
[DataMember]
private string transferringBank;
[DataMember]
public string TransferId DataMemberAttribute on
{ fields to be serialized
get { return transferId; }
set { transferId = value; }
}
} Must have setter
Customizing a Data Contract
Use properties on DataContractAttribute
Name
Namespace
Name
IsRequired
EmitDefaultValue
Order
Versioning Data Contracts
Contract
metadata
Client
Generate Service
Data types
Client
Logon information
Password Pa$$w0rd
• Best Practices