WCF基础之Message类
客户端和服务端的通信都是通过接收和发送的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类的更多相关文章
- WCF初探-22:WCF中使用Message类(上)
前言 从我们学习WCF以来,就一直强调WCF是基于消息的通信机制.但是由于WCF给我们做了高级封装,以至于我们在使用WCF的时候很少了解到消息的内部机制.由于WCF的架构的可扩展性,针对一些特殊情况, ...
- WCF初探-23:WCF中使用Message类(下)
前言 在上一篇WCF中使用Message类(上)中,文章介绍了WCF中使用Message类的基本知识和怎样创建消息,本文是承接上一篇文章,如果想要更好的阅读本文,请先阅读上一篇文章.在这篇文章中,我将 ...
- wcf中的Message类
客户端->服务端—>客户端 客户端代码: using (new OperationContextScope(client.InnerChannel)) { ...
- WCF基础教程之异常处理:你的Try..Catch语句真的能捕获到异常吗?
在上一篇WCF基础教程之开篇:创建.测试和调用WCF博客中,我们简单的介绍了如何创建一个WCF服务并调用这个服务.其实,上一篇博客主要是为了今天这篇博客做铺垫,考虑到网上大多数WCF教程都是从基础讲起 ...
- WCF入门教程:WCF基础知识问与答(转)
学习WCF已有近两年的时间,其间又翻译了Juval的大作<Programming WCF Services>,我仍然觉得WCF还有更多的内容值得探索与挖掘.学得越多,反而越发觉得自己所知太 ...
- WCF服务编程 读书笔记——第1章 WCF基础(2)
续:第1章 WCF基础(1) 元数据交换 服务有两种方案可以发布自己的元数据.一种是基于HTTP-GET协议提供元数据, 另一种则是后面将要讨论的使用专门的终结点的方式.WCF能够为服务自动提供基于H ...
- WCF服务编程 读书笔记——第1章 WCF基础(1)
第1章 WCF基础 本章主要介绍WCF的基本概念.构建模块以及WCF体系架构,以指导读者构建一个简单的WCF服务.从本章的内容中,我们可以了解到WCF的基本术语,包括地址(Address).绑定(Bi ...
- WCF技术剖析之一:通过一个ASP.NET程序模拟WCF基础架构
原文:WCF技术剖析之一:通过一个ASP.NET程序模拟WCF基础架构 细算起来,已经有好几个月没有真正的写过文章了.近半年以来,一直忙于我的第一本WCF专著<WCF技术剖析>的写作,一直 ...
- UML基础系列:类图
类图描述系统中类的静态结构,它不仅定义系统中的类,描述类之间的联系,如关联.依赖.聚合等,还包括类的内部结构(类的属性和操作).类图描述的是静态关系,在系统的整个生命周期中都是有效的.对象图是类图的实 ...
随机推荐
- 关于hibernate中映射中有many to one等外键关联时的问题
hibernate中的对象的3种状态的理解及导致报错object references an unsaved transient instance - save the transient insta ...
- Solr6.6.0 用 SimplePostTool索引文件
一.背景介绍 Solr启动并运行之后,并不包含任何数据,在solr的安装目录下的bin目录中,有一个post工具,我们可以使用这个工具往solr上传数据,这个工具必须在命令行中执行,post工具是一个 ...
- Python-爬虫-针对有frame框架的页面
有的页面会使用frame 框架,使用Selenium + PhantomJS 后并不会加载iframe 框架中的网页内容.iframe 框架相当于在页面中又加载了一个页面,需要使用Selenium 的 ...
- DTD 和 Schema简介
什么是DTD? DTD(文档类型定义)的作用是定义 XML 文档的合法构建模块. 它使用一系列的合法元素来定义文档结构. DTD例子 <?xml version="1.0"? ...
- vs2010 编译多个project问题
使用VS2010 编译从vc6.0复制过来的原project文件源代码.提示错误非常多.感觉无从下手.非常多原始的函数和API參数都提示类型 错误或者不兼容. 百度一下.第一个问题: vc6.0使用A ...
- Android学习(十八)Toast的使用
一.什么是Toast 1.Toast是一种提供给用户简洁提示信息的视图. 2.该视图以浮于应用程序之上的形式呈现给用户, Toast提示界面不获取焦点,在不影响用户使用的情况下,给用户某些提示. 3. ...
- Jmeter启动报注册表警告
启动Jmeter后,控制台出现如下的警告: 主要出现的原因是: java.util.prefs.WindowsPreferences需要保存信息到HKEY_LOCAL_MACHINE\Software ...
- JavaScript target与currentTarget区别
1.DOM事件绑定到父元素 <!DOCTYPE html> <html lang="zh"> <head> <meta charset=& ...
- 【VBA】修改Excle的标题
打开Excle的时候,有时候不需要显示Miscrosoft Excle,如下图标记,想把标记内的内容替换为:管理系统 操作代码: Public Sub 修改标题() Application.Capti ...
- 51单片机 | 模拟PWM调制控制实验
———————————————————————————————————————————— PWM(脉冲宽度调制) 对模拟信号电平进行数字编码的方法 - - - - - - - - - - - - - ...