WCF 回调原理
2014-06-07 17:46
148 查看
WCF回调操作简单的说就是由服务端来调用客户端的方法,回调时原先的服务端和客户端将发生对调,服务端成为客户端,客户端成为服务端。
在回调操作模式中,客户端对服务端调用实际上进行了四次通信
ServiceRequest:客户端向服务端发出调用,在调用的过程中会把回调实例的引用一起发送到服务端。
CallbackRequest:服务端从上一步的请求中取得对回调实例的引用,通过该回调实例向客户端发出的回调请求。
CallbackResponse:客户端执行完回调后向服务端返回的响应,如果回调契约中的方法契约被定义为IsOnWay的话,这一步不会发生。
ServiceResponse:服务端方法执行完后向客户端返回信息(方法的返回值等)。
1、WCF回调的必要条件:并不是所有的绑定都支持回调操作,只有具有双向通信能力的绑定才可以使用回调。比如HTTP是与连接无关的因此不能用于回调。这就说明我们不能使用BasicHttpBinding或WSHttpBinding进行回调。WCF中NetTcpBinding和NetNamedPipeBinding支持回调,因为从本质上讲TCP和IPC协议支持双向通信。WCF中wsDualHttpBinding也是支持回调的因为它实际上是设置了两个HTTP通道
2、定义回调契约
回调契约是服务端定义客户端回调类的规范,客户端需要根据此契约生成回调类,服务端就通过此契约来调用客户端的相应方法。回调方法是在客户端执行的,而回调契约是定义在服务端,它规定客户端回调类的实现契约。一个服务契约若要定义回调,必须专门定义一个用于回调的契约。一个服务契约最多包含一个回调契约,一个服务契约一旦定义了回调契约那客户端必须支持这个回调。那如何为一个服务契约定义回调呢?使用ServiceContract特性的CallBackContract特性,代码如下
[ServiceContract(CallbackContract =
typeof(ISomeCallbackContract))]
public interface IService1
{
[OperationContract(IsOneWay=true)]
void DoSomething();
}
//用于回调的契约
interface ISomeCallbackContract
{
[OperationContract(IsOneWay=true)]
void SomeCallbackMethod();
[OperationContract(IsOneWay = true)]
void SomeCallbackMethod2();
}
3、客户端回调设置
客户端需要实现服务端定义的那个用于回调的契约ISomeCallbackContract,然后实例化回调对象再通过它创建一个上下文对象InstanceContext。然后用代理把这个回调的引用传回服务端
4、下面通过代码实例说明:
服务端代码
[ServiceContract(CallbackContract =
typeof(ISomeCallbackContract))]
public interface IService1
{
[OperationContract(IsOneWay=true)]
void DoSomething();
}
//用于回调的契约,这里可以不用再申明ServiceContract,因为上面用了CallBackContract
自然就申明了
interface ISomeCallbackContract
{
[OperationContract(IsOneWay=true)]
void SomeCallbackMethod();
[OperationContract(IsOneWay = true)]
void SomeCallbackMethod2();
}
实现服务的类:
[ServiceBehavior(InstanceContextMode =
InstanceContextMode.PerSession, ConcurrencyMode =
ConcurrencyMode.Reentrant)]
public class Service1 : IService1
{
static List m_Callbacks = new List();
public void DoSomething()
{
//获得由客户端传入的回调终结点的引用,使用这个引用可以调用客户端方法
ISomeCallbackContract callback =
OperationContext.Current.GetCallbackChannel();
if (m_Callbacks.Contains(callback) == false)
{
m_Callbacks.Add(callback);
}
Trace.WriteLine("DoSomething");
//调用客户端实现的SomeCallbackMethod2方法,
callback.SomeCallbackMethod2();
CallClients();
}
static public void CallClients()
{
Action invoke = delegate(ISomeCallbackContract callback)
{
callback.SomeCallbackMethod();
};
m_Callbacks.ForEach(invoke);
在回调操作模式中,客户端对服务端调用实际上进行了四次通信
ServiceRequest:客户端向服务端发出调用,在调用的过程中会把回调实例的引用一起发送到服务端。
CallbackRequest:服务端从上一步的请求中取得对回调实例的引用,通过该回调实例向客户端发出的回调请求。
CallbackResponse:客户端执行完回调后向服务端返回的响应,如果回调契约中的方法契约被定义为IsOnWay的话,这一步不会发生。
ServiceResponse:服务端方法执行完后向客户端返回信息(方法的返回值等)。
1、WCF回调的必要条件:并不是所有的绑定都支持回调操作,只有具有双向通信能力的绑定才可以使用回调。比如HTTP是与连接无关的因此不能用于回调。这就说明我们不能使用BasicHttpBinding或WSHttpBinding进行回调。WCF中NetTcpBinding和NetNamedPipeBinding支持回调,因为从本质上讲TCP和IPC协议支持双向通信。WCF中wsDualHttpBinding也是支持回调的因为它实际上是设置了两个HTTP通道
2、定义回调契约
回调契约是服务端定义客户端回调类的规范,客户端需要根据此契约生成回调类,服务端就通过此契约来调用客户端的相应方法。回调方法是在客户端执行的,而回调契约是定义在服务端,它规定客户端回调类的实现契约。一个服务契约若要定义回调,必须专门定义一个用于回调的契约。一个服务契约最多包含一个回调契约,一个服务契约一旦定义了回调契约那客户端必须支持这个回调。那如何为一个服务契约定义回调呢?使用ServiceContract特性的CallBackContract特性,代码如下
[ServiceContract(CallbackContract =
typeof(ISomeCallbackContract))]
public interface IService1
{
[OperationContract(IsOneWay=true)]
void DoSomething();
}
//用于回调的契约
interface ISomeCallbackContract
{
[OperationContract(IsOneWay=true)]
void SomeCallbackMethod();
[OperationContract(IsOneWay = true)]
void SomeCallbackMethod2();
}
3、客户端回调设置
客户端需要实现服务端定义的那个用于回调的契约ISomeCallbackContract,然后实例化回调对象再通过它创建一个上下文对象InstanceContext。然后用代理把这个回调的引用传回服务端
4、下面通过代码实例说明:
服务端代码
[ServiceContract(CallbackContract =
typeof(ISomeCallbackContract))]
public interface IService1
{
[OperationContract(IsOneWay=true)]
void DoSomething();
}
//用于回调的契约,这里可以不用再申明ServiceContract,因为上面用了CallBackContract
自然就申明了
interface ISomeCallbackContract
{
[OperationContract(IsOneWay=true)]
void SomeCallbackMethod();
[OperationContract(IsOneWay = true)]
void SomeCallbackMethod2();
}
实现服务的类:
[ServiceBehavior(InstanceContextMode =
InstanceContextMode.PerSession, ConcurrencyMode =
ConcurrencyMode.Reentrant)]
public class Service1 : IService1
{
static List m_Callbacks = new List();
public void DoSomething()
{
//获得由客户端传入的回调终结点的引用,使用这个引用可以调用客户端方法
ISomeCallbackContract callback =
OperationContext.Current.GetCallbackChannel();
if (m_Callbacks.Contains(callback) == false)
{
m_Callbacks.Add(callback);
}
Trace.WriteLine("DoSomething");
//调用客户端实现的SomeCallbackMethod2方法,
callback.SomeCallbackMethod2();
CallClients();
}
static public void CallClients()
{
Action invoke = delegate(ISomeCallbackContract callback)
{
callback.SomeCallbackMethod();
};
m_Callbacks.ForEach(invoke);
相关文章推荐
- Hadoop pipes设计原理
- UIScrollView 原理详解
- 【转】Hibernate 的原理与配置
- Select函数实现原理分析 (转)
- 我的windows mobile WCF项目
- VIP 原理和特点
- UIScrollView 原理
- FW:分布式实时计算storm 原理…
- FW:分布式实时计算storm 原理…
- [分享]Java 线程池的原理与实现
- autorelease pool 原理剖析
- FW:分布式实时计算storm 原理…
- ARM中断原理, 中断嵌套的误区…
- ARM MMU工作原理剖析(转)
- FW:分布式实时计算storm 原理…
- Java NIO原理和使用
- ARM中断原理, 中断嵌套的误区…
- ARM9 2410移植之ARM中断原理,…
- WCF 契约版本管理—IExtensibl…
- bash:command not found以及原理