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基础系列:类图
类图描述系统中类的静态结构,它不仅定义系统中的类,描述类之间的联系,如关联.依赖.聚合等,还包括类的内部结构(类的属性和操作).类图描述的是静态关系,在系统的整个生命周期中都是有效的.对象图是类图的实 ...
随机推荐
- XShell命令行使用
1.建立连接: 2.查看总体目录: 3.查看对应服务目录: 4.删除对应jar包后,再查看目录下文件: 5.上传对应的jar文件: 6.重启服务 7.查看服务日志: 8.mv old-name new ...
- tar命令解压缩出错
[root@zhoucentos share1]# tar zxvf otp_src_19..tar.gz gzip: stdin: not in gzip format tar: Child ret ...
- JAVA Eclipse Incorrect line ending found carriage return 怎么办
点击项目-清理即可
- SOYO的主板如何进入BIOS系统
1 开机按Del键进入BIOS系统 2 进入Advanced BIOS Features 3 选择 Hard Disk Boot Priority 按ENTER 4 选择要启动的设备,比如 ...
- Oracle基础(三) 表空间
数据库的存储结构 数据库主要用于存储和检索相关的信息,Oracle数据库包含逻辑结构和物理结构. 物理结构是指现实存储单元,由一组文件组成如数据文件.日志文件.控制文件. 数据文件:用于存储数据的文件 ...
- 开发ionic准备之安卓模拟器设置(2)
发现这个安卓模拟器设置屏幕还不能太大,太大显示不全,然后整个模拟器不能拖动,所以尽量不要设置太大的分辨率 ,如下即可 如果选安卓4.4然后勾选了其他下面的ok还不能点击的话,这下要去sdk manag ...
- 原 [Android]LIstView的HeaderView
目录[-] (1)添加HeaderView之后尺寸布局被忽略. (2)添加HeaderView之后导致OnItemClickListener的position移位 (3)LayoutInflater的 ...
- sql语句偶记录
查看表结构: show FULL COLUMNS FROM tablename;
- LINUX find 实用
查找文件find ./ -type f 查找目录find ./ -type d 查找名字为test的文件或目录find ./ -name test 查找名字符合正则表达式的文件,注意前面的‘.*’(查 ...
- (三)spark算子 分为3大类
ation算子通过sparkContext执行提交作业的runJob,触发rdd的DAG执行 (foreach) foreach(f) 会对rdd中的每个函数进行f操作,下面的f操作就是打印输出没有元 ...