关于wcf中的双工模式理解

wcf消息模式分为3种,请求答复:客户端向服务端发送一个请求,不论服务端如何处理是否有返回值即使方法是:void那么也会返回来一个消息来答复,

单向消息就是:在服务器端的方法属性标签加上IsOneWay=true表示客户端只要将请求发送离开客户端就不再等待服务端的返回消息。

双工模式消息就是:客户端可以向服务端发送请求。同时服务端也可以像客户端发送请求。

举个现实中理解:想淘宝商家发送货物给买家。当商家将货物给了快递。那么他就继续做它其他工作。就像单向消息那种,

但买家通过在商家那购买了物品不论有货无货。或者其他原因。卖家可回复自己消息同时卖家也可以主动联系买家。理解为双工。。

具体做个双工DEMO

 

namespace msdndemo2
{
    // 注意: 如果更改此处的接口名称“IService1”,也必须更新 App.config 中对“IService1”的引用。
    //定义会话模式同时定义可访问的客户端的接口标准。
    [ServiceContract(SessionMode = SessionMode.Required, CallbackContract = typeof(IDuplexCallBack))]
    public interface IService1
    {
        [OperationContract]
        void Add(int a, int b);
        [OperationContract]
        void Multi(int a, int b);

      }

 

    public interface IDuplexCallBack//定义客户端要实现的方法。
    { 
        [OperationContract(IsOneWay = true)]
        void Equals(double n);
        [OperationContract(IsOneWay = true)]
        void Equaltioan(string result);

    }
}

实现接口

 

  // 注意: 如果更改此处的类名“IService1”,也必须更新 App.config 中对“IService1”的引用。
    [ServiceBehavior(InstanceContextMode = InstanceContextMode.PerSession)]
    public class Service1 : IService1
    {
        double cnum;
        string result;
        IDuplexCallBack callb = null;

        #region IService1 成员

        public Service1()
        {
            cnum = 0.0;
            result = cnum.ToString();
            callb = OperationContext.Current.GetCallbackChannel<IDuplexCallBack>();//获取当前线程操作的客户端的通道,及就是当前会话中的哪些方法可被服务端访问。
        
        }
        public void Add(int a, int b)
        {
            cnum += a + b;
            result = cnum.ToString();
            callb.Equals(cnum);

        }

        public void Multi(int a, int b)
        {
            cnum += a * b;
            callb.Equals(cnum);
          
        }

        #endregion
    }

改变app.config的

binding="wsDualHttpBinding"  因wshttpbinding不能双工

客户端调用

 

namespace ConsoleApplication1
{
    public class callbackHandler : WcfWebService.IService1Callback
    {

        #region IService1Callback 成员

        public void Equals(double n)
        {
            Console.WriteLine("偶的回调值是:{0}", n);
        }

        public void Equaltioan(string result)
        {
            Console.WriteLine("偶的回调值是:{0}", result);
        }

        #endregion
    }

    class Program
    {
        static void Main(string[] args)
        {
            InstanceContext indlup = new InstanceContext(new callbackHandler());//实现服务实例指定对象就是将哪些对象为服务端可调用
            WcfWebService.Service1Client ws = new ConsoleApplication1.WcfWebService.Service1Client(indlup);
            ws.Add(10, 10);
            ws.Multi(2, 3);
            Console.WriteLine("wcfdemo");
            ws.Close();
        }
    }
}

 

 

转载于:https://www.cnblogs.com/zhbsh/archive/2011/05/19/2050665.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值