热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

WCF初探23:WCF中使用Message类(下)

前言?在上一篇WCF中使用Message类(上)中,文章介绍了WCF中使用Message类的基本知识和怎样创建消息,本文是承接上一篇文章,如果想要更好的阅读本文,请先阅读上一篇文

前言

  • 在上一篇WCF中使用Message()中,文章介绍了WCF中使用Message类的基本知识和怎样创建消息,本文是承接上一篇文章,如果想要更好的阅读本文,请先阅读上一篇文章。在这篇文章中,我将介绍怎样来操作消息。
  • WCF中使用Message()中,我们知道了消息的基本结构,针对不同的情况,我们对消息进行了创建。在创建消息后,我们还可以对消息进行写入、读取、复制等操作,以便我们在不同的任务环境下更好的运用消息传输机制。

通过Message类提取消息正文的几种方式

  • Message 类支持多种从其正文提取信息的方式。它们可分为以下几类:
  1. 将整个消息正文一次性写出到 XML 编写器。这称为“写入消息”。
  2. 将 XML 读取器放在消息正文上。这使您可以在以后根据需要逐段访问消息正文。这称为“读取消息”。
  3. 可以将整个消息(包括它的正文)复制到类型为 MessageBuffer 的内存中缓冲区。这称为“复制消息”。
  • 注意:无论使用哪种访问方式,都只能访问 Message 的正文一次。消息对象具有 State 属性,该属性最初设置为 Created。前面列表中描述的三种访问方法分别将状态设置为 Written、Read 和 Copied。此外,Close 方法可以在不再需要消息正文内容时将状态设置为 Closed。只有当消息正文处于 Created 状态时,才能对其进行访问,并且在状态已更改后,无法返回到 Created 状态。

写入消息

  • Message类为我们提供了几种写入消息的方法
  1. WriteBodyContents 方法:将给定 Message 实例的正文内容写出到给定 XML 编写器
  2. WriteBody 方法:执行相同的操作,不同之处在于该方法将正文内容封装在适当的包装元素(如 )中。
  3. WriteMessage方法:写出整个消息,包括 SOAP 包装信封和标头。如果禁用 SOAP(Version 为 MessageVersion.None),则所有这三个方法都执行相同的操作:写出消息正文内容。
  • 注意:本文采用的示例为WCF中使用Message()中所使用的示例,源码已经在文章底部的评论区给出,下载后,我们可以根据本文的操作完善代码,验证我们对消息的操作。本文的源码也已经在文章底部的评论区给出。
  • 我们可以分别采用Message类不同的操作方法类写入消息结构。参考代码如下:
        //写入消息
        Message message = proxy.GetDataXml();
        FileStream stream = new FileStream(@"c:/log.xml", FileMode.Create);
        XmlDictionaryWriter xdr = XmlDictionaryWriter.CreateTextWriter(stream, Encoding.UTF8);
        message.WriteBodyContents(xdr);
        //message.WriteBody(xdr);
        //message.WriteMessage(xdr);
        xdr.Flush();
        Console.WriteLine("消息写入成功");
  1. 使用WriteBodyContents写入消息结构,写入后我们可以看到log.xml的文件结构如下:

   技术分享

  2.  使用WriteBody写入消息结构,写入后我们可以看到log.xml的文件结构如下:

   技术分享

  3.  使用WriteMessage写入消息结构,写入后我们可以看到log.xml的文件结构如下

   技术分享

读取消息

  • 读取消息正文的主要方式是调用 GetReaderAtBodyContents。您会取回一个 XmlDictionaryReader 以便用于读取消息正文。请注意,只要调用了 GetReaderAtBodyContents,Message 就会转换到 Read 状态,而不是在您使用返回的 XML 读取器时发生转换。
  • 使用 GetBody 方法还可以将消息正文作为类型化对象进行访问。在内部,此方法使用 GetReaderAtBodyContents,因而也会将消息状态转换为 Read 状态。
  • 接下来,我将使用GetBody来读取从对象中创建的消息,参考代码如下:
    //读取消息
        Message message = proxy.GetDataObject();
        User user = message.GetBody();
        Console.WriteLine("读取消息信息成功");
        Console.WriteLine(user.ID+"->"+user.Name);

  运行结果显示如下:

  技术分享

将消息复制到缓冲区中

  • 要使整个消息缓存到内存中,可以通过调用 CreateBufferedCopy 达到此目的。此方法采用一个表示最大缓冲区大小的整型参数,且创建一个不大于此大小的缓冲区。
  • 缓冲区作为一个 MessageBuffer 实例返回。可以通过几种方式访问缓冲区中的数据。主要方式是调用 CreateMessage 以便从缓冲区创建 Message 实例。
  • 访问消息缓冲区内容的方式是使用 WriteMessage 将缓冲区的内容写出到流中。
  • 接下来,我们通过使用CreateBufferedCopy来创建消息缓存区,并使用WriteMessage将消息写入到log.xml文件中,参考代码如下:
       //复制消息
        Message message = proxy.GetDataXml();
        MessageBuffer mb = message.CreateBufferedCopy(65536);
        FileStream stream = new FileStream(@"c:/log.xml", FileMode.Create);
        mb.WriteMessage(stream);
        stream.Flush();
        Console.WriteLine("复制消息信息成功");

  运行后,log.xml文件结构如下:

  技术分享

访问其他消息部分

  • Headers 属性表示消息头。可以通过类型为 MessageHeaders 的 Headers 属性来访问标头。MessageHeaders 是一个 MessageHeaderInfo 对象集合,可以通过其 IEnumerable 接口或其索引器来访问各个标头。
  • Properties 属性表示消息属性,这些属性是附加到消息的命名数据段,且通常不会在发送消息时发出。请参见本主题稍后关于“使用属性”的部分。
  • Version 属性指示与消息相关联的 SOAP 和 WS-Addressing 版本;如果禁用了 SOAP,则该属性为 None。
  • IsFault 属性在消息为 SOAP 错误消息时返回 true。
  • IsEmpty 属性在消息为空时返回 true。
  • 接下来,我们将通过Message的实例输出其属性,参考代码如下:
          //访问消息的其他部分
          Message message = proxy.GetDataEmpty();
          Console.WriteLine("Version:" + message.Version.ToString());
          Console.WriteLine("State:" + message.State.ToString());
          Console.WriteLine("IsEmpty:" + message.IsEmpty.ToString());
          Console.WriteLine("IsFault:" + message.IsFault.ToString());
          Console.WriteLine("消息Headers包含的属性如下:");
          foreach (MessageHeaderInfo item in message.Headers)
          {
              Console.WriteLine(item.Name);
          }

  运行结果如下:

  技术分享

WCF初探-23:WCF中使用Message类(下)


推荐阅读
  • EPPlus绘制刻度线的方法及示例代码
    本文介绍了使用EPPlus绘制刻度线的方法,并提供了示例代码。通过ExcelPackage类和List对象,可以实现在Excel中绘制刻度线的功能。具体的方法和示例代码在文章中进行了详细的介绍和演示。 ... [详细]
  • Spring源码解密之默认标签的解析方式分析
    本文分析了Spring源码解密中默认标签的解析方式。通过对命名空间的判断,区分默认命名空间和自定义命名空间,并采用不同的解析方式。其中,bean标签的解析最为复杂和重要。 ... [详细]
  • Linux重启网络命令实例及关机和重启示例教程
    本文介绍了Linux系统中重启网络命令的实例,以及使用不同方式关机和重启系统的示例教程。包括使用图形界面和控制台访问系统的方法,以及使用shutdown命令进行系统关机和重启的句法和用法。 ... [详细]
  • android listview OnItemClickListener失效原因
    最近在做listview时发现OnItemClickListener失效的问题,经过查找发现是因为button的原因。不仅listitem中存在button会影响OnItemClickListener事件的失效,还会导致单击后listview每个item的背景改变,使得item中的所有有关焦点的事件都失效。本文给出了一个范例来说明这种情况,并提供了解决方法。 ... [详细]
  • 本文介绍了C#中生成随机数的三种方法,并分析了其中存在的问题。首先介绍了使用Random类生成随机数的默认方法,但在高并发情况下可能会出现重复的情况。接着通过循环生成了一系列随机数,进一步突显了这个问题。文章指出,随机数生成在任何编程语言中都是必备的功能,但Random类生成的随机数并不可靠。最后,提出了需要寻找其他可靠的随机数生成方法的建议。 ... [详细]
  • 本文介绍了Android 7的学习笔记总结,包括最新的移动架构视频、大厂安卓面试真题和项目实战源码讲义。同时还分享了开源的完整内容,并提醒读者在使用FileProvider适配时要注意不同模块的AndroidManfiest.xml中配置的xml文件名必须不同,否则会出现问题。 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • 本文介绍了在wepy中运用小顺序页面受权的计划,包含了用户点击作废后的从新受权计划。 ... [详细]
  • 模板引擎StringTemplate的使用方法和特点
    本文介绍了模板引擎StringTemplate的使用方法和特点,包括强制Model和View的分离、Lazy-Evaluation、Recursive enable等。同时,还介绍了StringTemplate语法中的属性和普通字符的使用方法,并提供了向模板填充属性的示例代码。 ... [详细]
  • Android工程师面试准备及设计模式使用场景
    本文介绍了Android工程师面试准备的经验,包括面试流程和重点准备内容。同时,还介绍了建造者模式的使用场景,以及在Android开发中的具体应用。 ... [详细]
  • 基于Socket的多个客户端之间的聊天功能实现方法
    本文介绍了基于Socket的多个客户端之间实现聊天功能的方法,包括服务器端的实现和客户端的实现。服务器端通过每个用户的输出流向特定用户发送消息,而客户端通过输入流接收消息。同时,还介绍了相关的实体类和Socket的基本概念。 ... [详细]
  • Todayatworksomeonetriedtoconvincemethat:今天在工作中有人试图说服我:{$obj->getTableInfo()}isfine ... [详细]
  • 本文介绍了pack布局管理器在Perl/Tk中的使用方法及注意事项。通过调用pack()方法,可以控制部件在显示窗口中的位置和大小。同时,本文还提到了在使用pack布局管理器时,应注意将部件分组以便在水平和垂直方向上进行堆放。此外,还介绍了使用Frame部件或Toplevel部件来组织部件在窗口内的方法。最后,本文强调了在使用pack布局管理器时,应避免在中间切换到grid布局管理器,以免造成混乱。 ... [详细]
  • Hibernate延迟加载深入分析-集合属性的延迟加载策略
    本文深入分析了Hibernate延迟加载的机制,特别是集合属性的延迟加载策略。通过延迟加载,可以降低系统的内存开销,提高Hibernate的运行性能。对于集合属性,推荐使用延迟加载策略,即在系统需要使用集合属性时才从数据库装载关联的数据,避免一次加载所有集合属性导致性能下降。 ... [详细]
  • PHP引用的概念和用法详解
    本文详细介绍了PHP中引用的概念和用法。引用是指不同的变量名访问同一个变量内容,类似于Unix文件系统中的hardlink。文章从引用的定义、作用、语法和注意事项等方面进行了解释和示例。同时还介绍了对未定义变量使用引用的情况,以及在函数和new运算符中使用引用的注意事项。 ... [详细]
author-avatar
英英2502927137
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有