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);
    }

}

实现代码

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);
        }
    }
}

客户端调用代码

        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("调用后");

        }

双工通信方式

服务端代码

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);
        }
    }
}

客户端代码

        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);
        }
    }

时间: 2024-12-21 23:03:41

WCF的三种模式的相关文章

httpd的三种模式比较

查看你的httpd使用了哪种模式: /usr/local/apache2/bin/httpd -V |grep 'Server MPM' 使用哪种模式,需要在编译的时候指定 --with-mpm=prefork|worker|event 当然也可以编译的时候,让三者都支持: --enable-mpms-shared=all 然后在配置文件中,修改 LoadModule mpm_worker_module modules/mpd_mpm_worker.so 2.2版本默认为worker,2.4版本

Oracle 11g dataguard三种模式以及实时查询(Real-time query)功能设置

之前我们讨论过<Linux Oracle 11g dataguard物理standby 配置过程>, 但是在实际过程中会遇到不同的问题,首先我们讨论下ORACLE DATAGUARD的三种模式, 保护最大化:这种模式的配置可以保证主库和备库的同步,任何情况下主库的损毁都不会导致已提交数据的丢失.如果主库和备库之间的网络出现问题,或者备库本身出现问题,都会导致主库停止数据处理. 可用最大化:这种模式和上面一种类似,也是会保证主库和备库的同步,区别在于,当网络或备库不可用时,主库仍然可以继续处理.

delegate,notifucation,KVO三种模式实现通信的优缺点

在开发ios应用的时候,我们会经常遇到一个常见的问题:在不过分耦合的前提下,controllers间怎么进行通信.在IOS应用不断的出现三种模式来实现这种通信: 1.委托delegation: 2.通知中心Notification Center: 3.键值观察key value observing,KVO 上面的三种模式是什么? 三种模式都是一个对象传递事件给另外一个对象,并且不要他们有耦合. 三种模式都是对象来通知某个事件发生了的方法,或者更准确的说,是允许其他的对象收到这种事件的方法.这对于

小米、华为与联想,背后隐含的三种模式(转)

1 月 15 号参加了小米产品发布会,正当雷军在台上讲小米 Note 的种种功能时我却突然意识到小米.华为.联想的拼杀到了 2015 年已经完全进入到了一个新的阶段.在功能和体验上诚然大家会激烈的彼此追赶但其实已经拉不开太多的距离,最终决定胜负的很可能是手机背后所体现出来的模式.这很像一场国战,胜负不再取决于一城一地而是取决于综合国力. 小米.华为与联想背后隐含的商业模式 虽然最终呈现给用户的手机是类似的,但就我看来这三家背后隐含的模式却是有本质不同. 联想是经典的经营管理派.这一派的基本逻辑是

hadoop学习;自己定义Input/OutputFormat;类引用mapreduce.mapper;三种模式

hadoop切割与读取输入文件的方式被定义在InputFormat接口的一个实现中.TextInputFormat是默认的实现,当你想要一次获取一行内容作为输入数据时又没有确定的键.从TextInputFormat返回的键为每行的字节偏移量,但眼下没看到用过 曾经在mapper中曾使用LongWritable(键)和Text(值),在TextInputFormat中,由于键是字节偏移量.能够是LongWritable类型,而当使用KeyValueTextInputFormat时,第一个分隔符前后

Hive 之元数据库的三种模式

Hive 介绍 http://www.cnblogs.com/sharpxiajun/archive/2013/06/02/3114180.html Hive的数据类型和数据模型 http://www.cnblogs.com/sharpxiajun/archive/2013/06/03/3114560.html Hive内表与外表详述 http://www.aboutyun.com/thread-7458-1-1.html Hive的体系结构 http://blog.csdn.net/zhoud

APP开发的三种模式

APP开发的三种模式:Native App .web App.hybrid App 1.原生app 使用原生app (android或iOS)开发APP.. 技术: Native技术主要用于提供原生支持,要做到跨平台,就需要掌握部分Android和iOS的知识,除了多线程,文件存储等基础知识,Android需要非常熟练的掌握WebView.WebSettings.WebChromeClient.WebClient四大对象.iOS需要非常熟练掌握UIWebView对象. 缺点:技术多,门槛高.无法

高性能服务器——I/O多路转接的三种模式(select &poll& epoll)

一.简单的服务器I/O模型 最简单的的TCP服务器,有三种模式: 1.单执行流,一个server端连接一个client端 2.多进程,一个server端通过多进程的方式,每个进程连接一个client端 3.多线程,一个server端通过多进程的方式,每个线程连接一个client端 (http://zhweizhi.blog.51cto.com/10800691/1830267) 这里实现过 要提升服务器性能,其实就是想要让一个server端能在负载允许的情况下,连接尽可能多的client端. 因

vim 的三种模式的用法

vim的三种模式一般模式 在这个模式下,可以:上下移动光标,删除某个字符,删除某行,复制.粘贴一行或者多行. 一般模式下的光标移动 h或者向左方向键 光标向左移动一个字符 l或者向右方向键 光标向右移动一个字符 k或者向上方向键 光标向上移动一个字符 j或者向下方向键 光标向下移动一个字符 Ctrl+f或pageup键 屏幕向前移动一页 Ctrl+b或pagedown键 屏幕向后移动一页 数字0或者Shift + 6 移动到本行行首 Shift + 4 移动到本行行尾 gg 移动到首行 G 移动