zoukankan      html  css  js  c++  java
  • 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
  • 相关阅读:
    Window PHP 使用命令行模式
    LNMP ftp 可以登录无权限操作?
    linux 允许mysql用户远程访问
    解决报错:scandir() has been disabled for security reasons
    LNMP 配置二级域名
    MUI 图片上传剪切预览,可选(拍照+系统相册)
    MUI 单个图片上传预览(拍照+系统相册):先选择->预览->上传提交
    MUI 单图片压缩上传(拍照+系统相册): 选择立即上传
    循环递归的区别?
    如何让自己的广播只让指定的 app 接收?
  • 原文地址:https://www.cnblogs.com/zhuyapeng/p/6750199.html
Copyright © 2011-2022 走看看