客户端和服务端的通信都是通过接收和发送的Message实例建立起来的,大多数情况我们通过服务协定、数据协定和消息协定来构造传入和传出消息的。

一般什么时候使用Message类呢?不需要将消息序列化或者反序列化为.NET对象,无论消息内容如何,都进行常规处理。比如:读取磁盘中的文件并作为消息发送等等。

操作协定中的Message类的使用和消息协定相似,都只能有至多一个参数,而且必须为Message类或者消息协定,返回值必须是void、Message类或者消息协定。

创建消息有很多种,其重载如下:

练习几个常用的重载:

从object创建消息,如下,中间的string类型的action参数其实是操作契约的ReplyAction。不过不知道为什么,object类型为消息协议时,客户端解析时总是报命名空间不对,我试过改wrappernamespace等等,都没用,是我用法有错么?有大神经过,请留言指教。

public Message GetData()
        {
            MessageModel model =  };
            MessageVersion ver = OperationContext.Current.IncomingMessageVersion;
            return Message.CreateMessage(ver, "www.waha.com/ICreateMessageServcie/GetDataResponse", model);
        }

在客户端获取方法如下(object对象只有在服务契约中才会生成在客户端,所以我是手动添加的,不知有没有其他方法,请留言!):

CreateMessageServcieClient myClient = new CreateMessageServcieClient();
            var response = myClient.GetData();
            var model = response.GetBody<MessageModel>();
            Console.WriteLine("Name:{0} Age:{1}", model.Name, model.Age);
            Console.Read();

从xml读取器创建消息,如下:

public Message GetData()
{
  FileStream stream = new FileStream(@"D:\Test.xml",FileModel.Open);  XmlDictionaryReader xdr = XmlDictionaryReader.CreateTextReader(stream, new XmlDictionaryReaderQuotas());  MessageVersion ver = OperationContext.Currt.IncomingMessageVersion;
  return Message.CreateMessage(ver,"www.waha.com/ICreateMessageServcie/GetDataResponse",xdr);
}

读取有两种如下:

Message msg = client.GetData();
FileStream stream = new FileStream(@"D:\Log.xml", FileMode.Create);
XmlDictionaryWriter xdw = XmlDictionaryWriter.CreateTextWriter(stream);
msg.WriteMessage(xdw);
xdw.Flush();
Message msg = client.GetDataStream();
MessageBuffer mb = msg.CreateBufferedCopy();
FileStream stream = new FileStream(@"D:\Log.xml", FileMode.Append);
mb.WriteMessage(stream);
stream.Flush();

ok,顺带说了提取消息正文的三类方法:
将消息正文全部提出写入到xml文档中叫写入消息。

通过xml读取器根据需要逐个访问消息正文叫读取消息。

将整个消息复制到MessageBuffer的内存缓冲区中叫复制消息。

创建错误消息,如下:

public Message GetDataFault()
{
         FaultCode fc = new FaultCode("Receiver");
         MessageVersion ver = OperationContext.Current.IncomingMessageVersion;
         return Message.CreateMessage(ver, fc, "BadData", "www.waha.com/ICreateMessageServcie/GetDataResponse");
}

注意的是FaultCode不能被序列化,在客户端获取到的是xml。

当然还能访问消息的其他部分,获得消息的实例后直接点,就能看到,就不一直重复了。

WCF基础之Message类的更多相关文章

  1. WCF初探-22:WCF中使用Message类(上)

    前言 从我们学习WCF以来,就一直强调WCF是基于消息的通信机制.但是由于WCF给我们做了高级封装,以至于我们在使用WCF的时候很少了解到消息的内部机制.由于WCF的架构的可扩展性,针对一些特殊情况, ...

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

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

  3. wcf中的Message类

    客户端->服务端—>客户端 客户端代码: using (new OperationContextScope(client.InnerChannel))            {       ...

  4. WCF基础教程之异常处理:你的Try..Catch语句真的能捕获到异常吗?

    在上一篇WCF基础教程之开篇:创建.测试和调用WCF博客中,我们简单的介绍了如何创建一个WCF服务并调用这个服务.其实,上一篇博客主要是为了今天这篇博客做铺垫,考虑到网上大多数WCF教程都是从基础讲起 ...

  5. WCF入门教程:WCF基础知识问与答(转)

    学习WCF已有近两年的时间,其间又翻译了Juval的大作<Programming WCF Services>,我仍然觉得WCF还有更多的内容值得探索与挖掘.学得越多,反而越发觉得自己所知太 ...

  6. WCF服务编程 读书笔记——第1章 WCF基础(2)

    续:第1章 WCF基础(1) 元数据交换 服务有两种方案可以发布自己的元数据.一种是基于HTTP-GET协议提供元数据, 另一种则是后面将要讨论的使用专门的终结点的方式.WCF能够为服务自动提供基于H ...

  7. WCF服务编程 读书笔记——第1章 WCF基础(1)

    第1章 WCF基础 本章主要介绍WCF的基本概念.构建模块以及WCF体系架构,以指导读者构建一个简单的WCF服务.从本章的内容中,我们可以了解到WCF的基本术语,包括地址(Address).绑定(Bi ...

  8. WCF技术剖析之一:通过一个ASP.NET程序模拟WCF基础架构

    原文:WCF技术剖析之一:通过一个ASP.NET程序模拟WCF基础架构 细算起来,已经有好几个月没有真正的写过文章了.近半年以来,一直忙于我的第一本WCF专著<WCF技术剖析>的写作,一直 ...

  9. UML基础系列:类图

    类图描述系统中类的静态结构,它不仅定义系统中的类,描述类之间的联系,如关联.依赖.聚合等,还包括类的内部结构(类的属性和操作).类图描述的是静态关系,在系统的整个生命周期中都是有效的.对象图是类图的实 ...

随机推荐

  1. 转: java web demo的示例

    http://quqtalk.iteye.com/blog/360699 从事Java开发已经两年了,但是由于工作的关系,对Java Web还是个freshman.今天做了一个Java Web的简单D ...

  2. [GraphQL] Query a GraphQL API with graphql-request

    To query a GraphQL API, all you need to do is send an HTTP request that includes the query operation ...

  3. @classmethod, @staticmethod和@property这三个装饰器的使用对象是在类中定义的函数。下面的例子展示了它们的用法和行为:

    class MyClass(object): def __init__(self): self._some_property = "properties are nice" sel ...

  4. [转载]LoadRunner如何处理AJAX异步请求

    最近在网上经常有人问“LoadRunner脚本回放成功,但数据没有写入数据库,这是什么原因”,记得以前的同事也遇到过相同的问题,再次将解决方法贴出来,希望能帮助大家. 相信大家在做测试的过程中,特别是 ...

  5. 图解HTTP第六章:HTTP首部

    学习HTTP首部的结构和首部中各字段的用法. HTTP首部字段 使用首部字段是为了给浏览器和server提供报文主体大小.所使用的语言.认证信息等内容. 首部字段相应单个HTTP首部能够有多个值.假设 ...

  6. 最小化JavaScript代码

    1.去除不必要的格式符.空白符.凝视符. 这个操作.事实上能够理解为是一种格式化.尽管它操作的结果事实上是去除掉原始文件的那些格式. 2.模糊(Obfuscation)处理JAVASCRIP脚本源码. ...

  7. Android 四大组件学习之Server一

    上次学习了Android四大组件Activity之后,我们深刻理解了Activity.这次我们学习四大组件Service. Service与Activity的级别是一样的,都是Android系统不可缺 ...

  8. STL学习笔记(变序性算法)

    变序性算法改变元素的次序,但不改变元素值. 这些算法不能用于关联式容器,因为在关联式容器中,元素有一定的次序,不能随意变动. 逆转元素次序 void reverse(BidirectionalIter ...

  9. 基于Android平台的简易人脸检测库

    代码地址如下:http://www.demodashi.com/demo/12135.html ViseFace 简易人脸检测库,不依赖三方库,可快速接入人脸检测功能. 项目依赖:compile 'c ...

  10. NSTimer注意内存泄露(真该死)

    NSTimer可以用来执行一些定时任务,比较常用的方法就是: + (NSTimer *)timerWithTimeInterval:(NSTimeInterval)ti target:(id)aTar ...