码迷,mamicode.com
首页 > 其他好文 > 详细

WCF的三种模式

时间:2017-04-23 00:52:02      阅读:307      评论:0      收藏:0      [点我收藏+]

标签:命令   image   reading   session   服务   .sh   调用   opera   isp   

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的三种模式

标签:命令   image   reading   session   服务   .sh   调用   opera   isp   

原文地址:http://www.cnblogs.com/zhuyapeng/p/6750199.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!