wcf step by step:消息交换模式

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 发表评论
posted on 2008-03-06 12:19  蝈蝈  阅读(540)  评论(0编辑  收藏  举报