通过了解了WCF的一些基本概念并创建和编写WCF应用中的相应方法,实现了WCF服务和客户端之间的调用,就能够理解WCF应用是如何进行通信的。了解了一些基本的WCF概念后,还需要深入了解WCF消息的概念。

18.4.1 消息传递
  客户端与服务器之间是通过消息进行信息通信的,通过使用消息,客户端和服务器之间能够通过使用消息交换来实现方法的调用和数据传递。
1.Request/Reply消息传递模式
  Request/Reply模式是默认的消息传递模式,该模式调用服务器的方法后需要等待服务的消息返回,从而获取服务器返回的值。Request/Reply模式是默认模式,在声明时无需添加其模式的声明,示例代码如下所示。

-C#
        [OperationContract]
        string GetShopInformation(string address);//默认模式

  上述代码就使用了一个默认的Request/Reply模式进行消息传递,GetShopInformation方法同样需要实现,示例代码如下所示。

-C#
        public string GetShopInformation(string address)
        {
            if (address == "武汉")//判断地址
            {
                return "武汉麦当劳连锁店";//返回相应结果
            }
            else if (address == "北京")//判断地址
            {
                return "北京麦当劳连锁店";//返回相应结果
            }
            else if (address == "上海")//判断地址
            {
                return "上海麦当劳连锁店";//返回相应结果
            }
            else
            {
                return "没有该连锁店";//返回默认结果
            }
        }

  GetShopInformation方法返回一个string的值给客户端,客户端调用服务器的方法时,首先会向服务器发送消息,以告诉服务器客户端需要调用一个方法,当服务器接收消息后会返回消息给客户端。在这一段过程中,客户端会等待服务器端的相应,当客户端接受到服务器的相应后,则会呈现在客户端应用程序中。如图18-12所示。

图18-12 Request/Reply模式
2.One-way消息传递模式
  One-way模式和Request/Reply模式不同的是,如果使用One-way模式定义一个方法,该方法被调用后会立即返回。使用One-way模式修饰的方法必须是void方法,如果该方法不是void修饰的方法或者包括out/ref等参数,则不能使用One-way模式进行修饰,示例代码如下所示。

-C#
        [OperationContract(IsOneWay = true)]//标识One-way模式
        void OutputString();//定义方法

  该方法使用了One-way模式,则不能有参数的输出,只允许void关键字修饰该方法,OutpuString方法的具体实现如下所示。

-C#
        public void OutputString()//实现方法
        {
            Console.WriteLine("IsOneWay=true");
        }

  运行WCF应用后,执行OutpuString方法后结果如图18-13所示。

图18-13 One-way模式
  WCF的消息传递模式不仅包括这两种模式,还包括duplex模式,duplex是WCF消息传递中比较复杂的一种模式,由于篇幅限制,本书不再进行详细的介绍。

18.4.2 消息操作
  由于WCF的客户端和服务器之间都是通过消息响应和通信的,那么在WCF应用的运行过程中,消息是如何在程序之间进行操作的,这就需要通过XML文档来获取相应的结果。在客户端和服务器之间出现信息通信,并且客户端调用了服务器的方法时,就会产生消息,如GetSum方法。GetSum方法在接口中的代码如下所示。

-C#
        [OperationContract]//标识方法
        int GetSum(DateTime time);//定义方法

  在GetSum方法的实现过程中,只需要进行简单的操作即可,示例代码如下所示。

-C#
        public int GetSum(DateTime time)//实现方法
        {
            int BreadNum = 10;//声明必要字段
            int Milk = 5; //声明必要字段
            int HotDryNuddle = 20;//声明必要字段
            int today = BreadNum + Milk + HotDryNuddle;//实现计算
            return today; //返回值
        }

  上述代码执行后,客户端会调用服务器的GetSum方法,服务器接受响应再返回给客户端相应的值,如图18-14和图18-15所示。

图18-14 执行服务器方法

图18-15 返回的XML格式文档
  在运行后,测试客户端能够获取请求时和响应时的XML文档,其中请求时产生的XML文档如下所示。

+XML

  从上述代码可以看到在Action节中,使用了相应的方法GetSum,在WCF服务库编程中可以通过使用OperationContract.Action捕获相应的Action消息,示例代码如下所示。

-C#
        [OperationContract(Action = "GetSum", ReplyAction = "GetSum")]
        Message MyProcessMessage(Message m);

  MyProcessMessage实现示例代码如下所示。

-C#
        public Message MyProcessMessage(Message m)
        {
            CompositeType t = m.GetBody<CompositeType>();//获取消息
            Console.WriteLine(t.StringValue);//输出消息
            return Message.CreateMessage(MessageVersion.Soap11,
            "Add", new CompositeType("Hello World!"));//返回消息
        }

  上述代码将操作转换为消息后发送,开发人员可以通过Windows应用程序或ASP.NET应用程序获取修改后消息的内容。在进行消息的操作时,WCF还允许开发人员使用 MessageContractAttribute / MessageHeaderAttribute 来控制消息格式,这比 DataContractAttribute 要更加灵活。

WCF消息传递的更多相关文章

  1. WCF自定义扩展,以实现aop!

    引用地址:https://msdn.microsoft.com/zh-cn/magazine/cc163302.aspx  使用自定义行为扩展 WCF Aaron Skonnard 代码下载位置: S ...

  2. WCF学习之旅—WCF概述(四)

    一.WCF概述 1) 什么是WCF? Windows Communication Foundation (WCF) 是用于构建面向服务的应用程序的框架.借助 WCF,可以将数据作为异步消息从一个服务终 ...

  3. WCF学习系列三--【WCF Interview Questions – Part 3 翻译系列】

    http://www.topwcftutorials.net/2012/10/wcf-faqs-part3.html WCF Interview Questions – Part 3 This WCF ...

  4. WCF学习系列四--【WCF Interview Questions – Part 4 翻译系列】

    WCF Interview Questions – Part 4   This WCF service tutorial is part-4 in series of WCF Interview Qu ...

  5. [WCF编程]5.绑定概述

    一.绑定概述 WCF提供了一个编程框架,可以抽象化服务创建的复杂过程.绑定允许开发人员将精力集中在问题本身上,而无需考虑如何创建允许系统运行的架构,因为WCF已经创建了架构. 绑定类型是开发人员控制W ...

  6. WCF入门教程1——WCF简要介绍

    什么是WCF Windows Communication Foundation(WCF)是由微软开发的一系列支持数据通信的应用程序框架,可以翻译为Windows 通讯开发平台. 整合了原有的windo ...

  7. WCF

    --http://www.doc88.com/p-699300196010.html ---术语 WCF术语 消息(message) 消息是一个独立的数据单元,它可能由几个部分组成,包括消息正文和消息 ...

  8. 重温WCF之WCF中可靠性会话(十四)

    1.WCF中可靠性会话在绑定层保证消息只会被传输一次,并且保证消息之间的顺序.当使用TCP(Transmission Control Protocol,传输控制协议)通信时,协议本身保证了可靠性.然而 ...

  9. WCF初探-6:WCF服务配置

    WCF服务配置是WCF服务编程的主要部分.WCF作为分布式开发的基础框架,在定义服务以及定义消费服务的客户端时,都使用了配置文件的方法.虽然WCF也提供硬编程的方式,通过在代码中直接设置相关对象的属性 ...

随机推荐

  1. PWN入门

    pwn ”Pwn”是一个黑客语法的俚语词 ,是指攻破设备或者系统 .发音类似“砰”,对黑客而言,这就是成功实施黑客攻击的声音——砰的一声,被“黑”的电脑或手机就被你操纵.以上是从百度百科上面抄的简介, ...

  2. DVWA的Xss跨站总结

    Xss跨站总结 初级防护的代码 Poc:<script>alert(1)</script> 上图防护的代码 为输入的结果就为输出的结果 中级防护的代码 Poc:<scri ...

  3. 【技术知识】恶意PDF文件分析-PDFdump的问题

    1.提醒 百度分析恶意PDF文件,很多都是推荐PDFdump.在某次沙箱产品分析出疑似高级威胁的PDF样本后,我使用PDFdump查看ShellCode的加密数据,分析后并没有找到相关的ShellCo ...

  4. Windows修改默认远程端口号3389

    1.打开注册表:运行-regedit: 2.HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Terminal Server\Wds\Repwd\ ...

  5. contos 7创建阿里云镜像源

    今天在ESC上安装mariaDB,发现centOS 7默认的yum源上的mariaDB版本过低,然后又镜像到网易上,发现网易源上没有mariaDB,几经折腾才发现阿里镜像上mariaDB版本较新.更改 ...

  6. PHP isset()、empty()、is_null()的使用区别详解

    PHP的isset()函数 一般用来检测变量是否设置 格式:bool isset ( mixed var [, mixed var [, ...]] ) 功能:检测变量是否设置 返回值: 若变量不存在 ...

  7. Java ListIterator(迭代器)

    LIstIterator是一个更加强大的Iterator的子类型,它只能用于各种List类的访问,尽管Iterator只能向前移动,但是ListIterator可以双向移动,它还可以产生相对于迭代器在 ...

  8. PHP取整函数之ceil,floor,round,intval的区别

    我们经常用到的PHP取整函数,主要是:ceil,floor,round,intval. ceil -- 进一法取整 说明 float ceil ( float value ) 返回不小于 value ...

  9. phpMyAdmin setup.php脚本的任意PHP代码注入漏洞

    phpMyAdmin (/scripts/setup.php) PHP 注入代码 此漏洞代码在以下环境测试通过:      phpMyAdmin 2.11.4, 2.11.9.3, 2.11.9.4, ...

  10. Using MongoDB in C#

    In order to use MongoDB in C#, you can import MongoDB C# Driver to your project. It's best to create ...