wcf step by step:消息交换模式

mac2022-06-30  25

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上百实例源码以及开源项目
最新回复(0)