WCF的三种模式

Posted zhuyapeng

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了WCF的三种模式相关的知识,希望对你有一定的参考价值。

WCF通信的3种模式

1.正常模式:客户端调取接口-》等待服务响应-》接受响应-》执行客户端后面代码(wcf服务有入参,有返回值)

2.数据报模式:客户端调取接口-》不等待响应,直接执行客户端后面代码(wcf服务有入参,无返回值)

3.双工模式:客户端调取接口-》服务端立刻回复介绍到请求-》服务端继续执行,客户端也继续执行-》服务端执行回调客户端回调函数,传递信息给客户端(wcf服务有入参,无返回值,但必须定义客户端回调函数)

上代码:

接口代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;

namespace WCFServerLib
{
    // 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码和配置文件中的接口名“IService1”。
    [ServiceContract]
    public interface IService1
    {
        /*
         标记当前方法是一个请求响应方式
         * 请求数据,客户端等待相应结果,再去执行下面代码
         */
        [OperationContract]
        string GetData(int value);

        /*
          标记当前方法是一个数据报方法
         * 请求数据过去,但不响应结果,客户端不用等待
         */
        [OperationContract(IsOneWay=true)]
        void WriteLog(string msg);
    }


}
View Code

实现代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Serialization;
using System.ServiceModel;
using System.Text;

namespace WCFServerLib
{
    // 注意: 使用“重构”菜单上的“重命名”命令,可以同时更改代码和配置文件中的类名“Service1”。
    public class Service1 : IService1
    {
        public string GetData(int value)
        {
            System.Threading.Thread.Sleep(5000);
            return string.Format("接收到消息: {0}", value);
        }

        public void WriteLog(string msg)
        {
            System.Threading.Thread.Sleep(5000);
        }
    }
}
View Code

客户端调用代码

        private void button2_Click(object sender, EventArgs e)
        {
            //正常调用
            Client.ServiceReference1.Service1Client ss = new ServiceReference1.Service1Client();
            MessageBox.Show("调用前");
            string str= ss.GetData(121);
            MessageBox.Show(str);
        }

        private void button3_Click(object sender, EventArgs e)
        {
            //数据报
            Client.ServiceReference1.Service1Client ss = new ServiceReference1.Service1Client();
            MessageBox.Show("调用前");
            ss.WriteLog("123");
            MessageBox.Show("调用后");

        }
View Code

 

双工通信方式

服务端代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.ServiceModel;

namespace WCFServerLib
{
    //定义双工通信:通信模型1.立即会返回数据。2.处理完成会再次返回数据,通过设定好的回调函数。
    [ServiceContract(SessionMode=SessionMode.Required,CallbackContract=typeof(IResult))]
    public  interface  IDuplex
    {
        //IsOneWay=true:双工通信
        //双工通信不能有返回值
        [OperationContract(IsOneWay=true)]
        void Run(string msg);
    }

    /// <summary>
    /// 定义一个回调契约,供客户端实现它
    /// </summary>
    public interface IResult
    {
        [OperationContract(IsOneWay=true)]
        void Reuslt(string msg);
    }

    public class Duplex : IDuplex
    {
        IResult result;
        public Duplex()
        {
            //从方法的操作上下文中获取到客户端传递过来的IResult这个接口的实现类对象
            result = OperationContext.Current.GetCallbackChannel<IResult>();
        }
        public void Run(string msg)
        {
            //模拟5秒钟以后处理完成
            System.Threading.Thread.Sleep(5000);
            result.Reuslt("处理完成"+msg);
        }
    }
}
View Code

客户端代码

 

        private void button1_Click(object sender, EventArgs e)
        {
            System.ServiceModel.InstanceContext ic = new InstanceContext(new CallBacks());
            DuplexClient c = new DuplexClient(ic);
            c.Run("--1--");//立即返回处理数据
            MessageBox.Show("双工通信出来完毕");
        }
    }

    public class CallBacks : IDuplexCallback
    {
        /// <summary>
        /// 双工通信回调方法
        /// </summary>
        /// <param name="msg"></param>
        public void Reuslt(string msg)
        {
            MessageBox.Show(msg);
        }
    }
View Code

 

以上是关于WCF的三种模式的主要内容,如果未能解决你的问题,请参考以下文章

EF的三种模式

170728单例模式的三种水平代码

CPU的三种模式

Unity中Shader的三种基本类型

Java的三种代理模式

Java的三种代理模式