WCF

WCF Examples

WCF

WCF Projects

WCF Project

adplus-dvertising
Callback Connection Management
Previous Home Next

The callback mechanism provides higher-level protocol for managing the connection between the service and the callback endpoint

Exapmle of Explicit callback connection management

[ServiceContract(CallbackContract = typeof(IMyContractCallback))]
interface IMyContract
{
[OperationContract]
void operation( );

[OperationContract]
void Connectoperation( );

[OperationContract]
void DisConnectoperation( );
}
interface IMyContractCallback
{
[OperationContract]
void OnCallback( );
}
[ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall)]
class MyService : IMyContract
{
static List<IMyContractCallback> m_Callbacks = new List
	<IMyContractCallback>( );
public void Connectoperation( )
{
IMyContractCallback callback = OperationContext.Current.
GetCallbackChannel<IMyContractCallback>( );
if(m_Callbacks.Contains(callback) == false)
{
m_Callbacks.Add(callback);
}
}
public void DisConnectoperation( )
{
IMyContractCallback callback = OperationContext.Current.
GetCallbackChannel<IMyContractCallback>( );
if(m_Callbacks.Contains(callback) == true)
{
m_Callbacks.Remove(callback);
}
else
{
throw new InvalidOperationException("Cannot find callback");
}
}
public static void CallClients( )
{
 Action<IMyContractCallback> invoke = delegate
	 (IMyContractCallback callback)
{
callback.OnCallback( );
};
m_Callbacks.ForEach(invoke);
}
public void operation( )
{...}
}
Duplex Factory

WCF also provides DuplexChannelFactory<T>, which can be used for setting up duplex proxies programmatically.

DuplexChannelFactory<T> is used as base class, ChannelFactory<T>, except its constructors expect either a callback instance or a callback context.

public class DuplexChannelFactory<T> : ChannelFactory<T>
{
   public DuplexChannelFactory(object callback);
   public DuplexChannelFactory(object callback,string EPName);
   public DuplexChannelFactory(InstanceContext context,string EPName);
   public T CreateChannel(InstanceContext context);
   public static T CreateChannel(object callback,string EPName);
   public static T CreateChannel(InstanceContext context,string EPName);
   public static T CreateChannel(object callback,Binding binding,
                                EndpointAddress EPAddress);
   public static T CreateChannel(InstanceContext context,Binding binding,
                                 EndpointAddress EPAddress);
   //More members
}
Previous Home Next