wcf有三种消息交换模式,分析是oneway,request/response和duplex(双工)。其实在服务contract的定义时就已经指定了,前面没有提到是因为如果没有指定,默认是request/response的模式。这是最普通的一种模式,http就是这种消息模式。
request/response
请求-响应,如http发一个请求,iis会返回一个200表示成功。
在wcf中,客户端向服务端发一个请求,其实就是调用服务器的某一方法,服务端完成处理后,不管这个方法是否有返回值,都会给客户端发一个回应的消息,表明服务端处理完成了。request/response模式不需要特别声明,如
[OperationContract] string RequestResponseMethod(string name);
oneway
其实很简单,就是客户端给服务端发消息,然后服务端接到消息了自行处理,处理完不会给客户端返回任何消息。所以指定为oneway的消息模式,服务契约的接口不能包含有返回值或ref,out之类的参数。
如
[OperationContract(IsOneWay=true)] void OnWayMethod();注意OnWayMethod返回值必须是void,并不能带ref或out参数。其它与request/response一样。
duplex
这种模式比较特别,也非常有用。duplex会使服务端与客户端交换角色,即客户端可以向服务端主动发消息,服务端也可以与客户端主动发送消息,并且可以进行广播即给所有客户端发消息。
客户端调用服务端,服务端处理完后除被动的给客户端返回一个通知消息外,还可以主动调用客房端的方法,其实此时服务端自动变为客户端,客户端提升为服务端了,呵呵,是不是有点意思.wcf为我们做了很多,所以我们只需要简单几步就能搞定。
1.定义回调接口
[ServiceContract] public interface IDuplexCallback { [OperationContract] void HandleCallback(Employee emp); }
2.定义服务接口
[ServiceContract(CallbackContract = typeof(IDuplexCallback))] public interface IDuplexService { [OperationContract] void DuplexMethod(); }
注意我们为它指定了回调的类型
3.实现服务接口
[ServiceBehavior(ConcurrencyMode = ConcurrencyMode.Multiple)] public class DuplexService : IDuplexService { #region IDuplexService Members
public void DuplexMethod() { Console.WriteLine("DuplexMethod invoked");
IDuplexCallback callback = OperationContext.Current.GetCallbackChannel<IDuplexCallback>(); Employee emp = new Employee(); emp.ID = 0; emp.Name = "0"; callback.HandleCallback(emp); }
#endregion }
这里需要注意ConcurrencyMode枚举值,分别是Reentrant,Multiple和Single。duplex方式一定要指定为Reentrant或Multiple方式,默认是single方式,关于它们的用法请参照其它资料。另外就是从当前上下文件获取指定类型的回调接口类型OperationContext.Current.GetCallbackChannel<T>4.客户端 实现回调接口 public class DuplexCallbackServcie : IDuplexCallback { #region IDuplexCallback Members
public void HandleCallback(Shore.cnblogs.com.WCFData.Employee emp) { Console.WriteLine("emp id ={0};name ={1}", emp.ID, emp.Name); }
#endregion }
客户端调用时 DuplexCallbackServcie callback = new DuplexCallbackServcie(); DuplexServiceProxy duplexProxy = new DuplexServiceProxy(new System.ServiceModel.InstanceContext(callback)); duplexProxy.DuplexMethod(); 在代理对象的构造函数中指定InstanceContext对象,InstanceContext中指定回调的类型。
demo下载
shore 2008-03-06 12:19
发表评论
转载于:https://www.cnblogs.com/hotsoho.net/archive/2008/03/06/1206546.html
相关资源:JAVA上百实例源码以及开源项目