Previous | Home | Next |
If the single-threaded service instance tries to call back to its client, WCF will throw an InvalidOperationException to avoid a deadlock.Then possible solutions is that to configure the service for reentrancy. When configured for reentrancy, the service instance is still associated with a lock and only a single-threaded access is allowed. However, if the service is calling back to its client, WCF will silently release the lock first.
Example:
Configure for reentrancy to allow callbacks
[ServiceContract(CallbackContract = typeof(IMyContractCallback))] interface IMyContract { [OperationContract] void operation( ); } interface IMyContractCallback { [OperationContract] void OnCallback( ); } [ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Reentrant)] class MyService : IMyContract { public void operation( ) { IMyContractCallback imcc = OperationContext.Current. GetCallbackChannel<IMyContractCallback>( ); imcc.OnCallback( ); } }
Example:
One-way callbacks are allowed by default
[ServiceContract(CallbackContract = typeof(IMyContractCallback))] interface IMyContract { [OperationContract] void operation( ); } interface IMyContractCallback { [OperationContract(IsOneWay = true)] void OnCallback( ); } class MyService : IMyContract { public void operation( ) { IMyContractCallback imcc = OperationContext.Current. GetCallbackChannel<IMyContractCallback>( ); imcc.OnCallback( ); } }
Previous | Home | Next |