Callbacks
Callback contracts, just like service contracts, can propagate the service transaction to the callback client. You apply the TransactionFlow attribute, as with a service contract, for example:
interface IMyContractCallback
{
[OperationContract][TransactionFlow(TransactionFlowOption.Allowed)]
void OnCallback( );
}
[ServiceContract(CallbackContract = typeof(IMyContractCallback))]
interface IMyContract
{...}The callback method implementation can use the OperationBehavior attribute just like a service operation and specify requiring a transaction scope and auto-completion:
class MyClient : IMyContractCallback
{
[OperationBehavior(TransactionScopeRequired = true)]
public void OnCallback( )
{
Transaction transaction = Transaction.Current;
Debug.Assert(transaction!= null);
}
}Callback Transaction Modes
The callback client can have four modes of configuration: Service, Service/Callback, Callback, and None, analogous to the service transaction modes, except the service now plays the client role and the callback plays the service role in the previous service-side modes. For example, to configure the callback for Service transaction mode (that is, always using the service transaction), follow these steps:
Use a transaction-aware duplex binding with transaction flow enabled.
Set transaction flow to mandatory on the callback operation.
Configure the callback operation to require a transaction scope.
Example 7-25 shows a callback client configured for Service transaction.
Example 7-25. Configuring ...