WCF随笔3----消息编码器
我们都知道,message是wcf通信框架进行通信的最基本的单位,但是wcf开发人员其实根本不需要直接与message打交道,一样能够写好wcf相关的程序.这是因为整个框架都为我们做好了一切,当客户端创建了连接服务端的通道之后,通过客户端的代理想服务端发送消息的时候,wcf基础结构就开始忙着在背后创建,发送,接受处理message对象的工作.发送消息的时候其实是要经历过几次转换的,从发送者角度来看包括:序列化和编码,序列化是把message对象转换为xml数据,编码是将xml数据转换为特定的数据格式,比如常见的二进制格式.从服务端的角度看正好相反所以,从今天晚上开始进入message对象的学习.
在消息的序列化和编码的过程有两个重要的类型 XmlDictionaryReader,XmlDictionaryWriter,一个是读,另一个是写.先来说下XmlDictionaryWriter,它是用来序列化和编码message类型的,使用时,首先要创建XmlDictionaryWriter对象,我们在创建对象的时候一般是调用XmlDictionaryWriter中的静态函数,CreateTextWriter(),CreateBinaryWriter(),CreateDictionaryWriter(),CreateMtomWriter(),这个四个方法都会返回一个XmlDictionaryWriter对象,每个方法都有重载,至于每个方法参数是什么意思,呵呵,额也不是都知道,具体用的时候还是要去查msdn的..所以大家想进一步了解的话,还是自己查下吧...*_*,前面两个静态函数应该说使我们比较常用的.第一个的作用是为了产生基于文本编码的xml.第二个的作用是了产生基于二进制编码的xml.主要介绍这两个.刚刚说了,XmlDictionaryWriter是负责编码,将message编码成指定格式的xml数据,那么经过编码之后的数据就可以发送到服务端了,这个时候就要用到XmlDictionaryReader这个对象来对经过编码的数据进行解析了.它的使用基本上和XmlDictionaryWriter对象的用法一样,也是通过静态函数返回对象,针对四种不同的编码模式,它也有四种不同解析器.CreateTextReader(),CreateBinaryReader(),CreateDictionaryReader(),CreateMtomReader(),只要根据客户端的编码规则,选择相应的解码器就可以了.先上代码:
class Program
{
static void Main(string[] args)
{
Console.WriteLine("文本编码器:");
TextWriter();
Console.WriteLine("*******************我是美丽的分割线******************");
Console.WriteLine("二进制编码器:");
BinaryWriter();
Console.ReadLine();
}
//文本编码
public static MemoryStream TextWriter()
{
MemoryStream _stream = new MemoryStream();
//创建用于产生基于文本编码的xml的编码器
using (XmlDictionaryWriter writer = XmlDictionaryWriter.CreateTextWriter(_stream, Encoding.UTF8, false))
{
writer.WriteStartDocument();//说明开始编写版本为"1.0"并具有独立属性的 XML 声明。
writer.WriteElementString("LocalName", "ns", "value");
writer.WriteEndDocument();
writer.Flush();
}
Console.WriteLine("XmlDictionaryWriter has wrote {0} bytes", _stream.Position);
Byte[] _b = _stream.ToArray();
_stream.Position = ;
Console.WriteLine("二进制内容:{0}", BitConverter.ToString(_b));
//Console.WriteLine("转换成字符串:\n{0}", new StreamReader(_stream).ReadToEnd());
XmlDictionaryReader xmlreader = XmlDictionaryReader.CreateTextReader(_stream, new XmlDictionaryReaderQuotas());
xmlreader.MoveToContent();
Console.WriteLine("转换成字符串:\n{0}", xmlreader.ReadOuterXml()); return _stream;
}
//二进制编码
public static MemoryStream BinaryWriter()
{
MemoryStream _stream = new MemoryStream();
//创建用于产生二进制编码的xml的编码器
using (XmlDictionaryWriter writer = XmlDictionaryWriter.CreateBinaryWriter(_stream,null, null,false))
{
writer.WriteStartDocument();
writer.WriteElementString("LocalName", "ns", "value");
writer.WriteEndDocument();
writer.Flush();
}
Console.WriteLine("XmlDictionaryWriter has wrote {0} bytes", _stream.Position);
Byte[] _b = _stream.ToArray();
_stream.Position = ;
Console.WriteLine("二进制内容:{0}", BitConverter.ToString(_b));
//创建XmlDictionaryReader对象,将刚刚用二进制编码器进行编码的之后的数据读成字符串
XmlDictionaryReader xmlreader = XmlDictionaryReader.CreateBinaryReader(_b, new XmlDictionaryReaderQuotas());
xmlreader.Read();
Console.WriteLine("转换成字符串:\n{0}",xmlreader.ReadOuterXml()); return _stream;
}
}
运行结果:
在上面两种编码的模式中,我都使用了
XmlDictionaryReader这个对象,其实基于文本编码的xml数据,是可以直接用流读出来的,上面的代码我已经注释掉了,感兴趣的朋友可以试下,一样可以将数据都出来.
从上面的运行结果中我们可以看到二进制编码的模式比文本模式的效率要高,同样的数据,一个是22字节,另一个是77字节...嘿嘿,从性能上来看是可以考虑采用二进制编码器了
以上就是全部内容,写得比较粗糙~见谅哈...还是那句话,只是为了mark自己学习的点点滴滴``
WCF随笔3----消息编码器的更多相关文章
- 【.net 深呼吸】记录WCF的通信消息
前面老周给大伙伴们介绍了把跟踪信息写入日志文件的方法,今天咱们换个类似的话题来扯一下,对了,咱们就说说怎么把WCF的往来消息log下来吧. 尽管在现实生活中,我们不主张偷窥他人信息,不过,偷窥程序信息 ...
- [老老实实学WCF] 第九篇 消息通信模式(上) 请求应答与单向
老老实实学WCF 第九篇 消息通信模式(上) 请求应答与单向 通过前两篇的学习,我们了解了服务模型的一些特性如会话和实例化,今天我们来进一步学习服务模型的另一个重要特性:消息通信模式. WCF的服务端 ...
- wcf中的消息模式
1请求响应模式 a.wcf中的消息模式默认是请求响应模式 b.返回值是void默认也是请求响应模式,可返回服务端的错误信息 c.客户端在请求后,当前线程停止真到接受收服务器的响应 [Opereatio ...
- 跟我一起学WCF(1)——MSMQ消息队列
一.引言 Windows Communication Foundation(WCF)是Microsoft为构建面向服务的应用程序而提供的统一编程模型,该服务模型提供了支持松散耦合和版本管理的序列化功能 ...
- 在WCF中使用消息队列
在一些大型的解决方案中,假设我们的服务没有办法一直在线,或者因为这样那样的原因宕机了,有没有什么办法让客户端的影响最小化呢?答案是可以通过消息队列的方式,哪怕服务是没有在线的,客户端依然可以继续操作. ...
- WCF基础之消息协定
通常定义消息的架构,使用数据协定就够了,但是有时必须将类型精确映射到soap消息,方法两种:1.插入自定义soap标头:2.另一种是定义消息的头和正文的安全属性.消息协定通过MessageContra ...
- WCF自动添加消息头
客户端自定义消息查看器实现IClientMessageInspector接口在消息发送之前添加消息头 class ClientMessageInspector : System.ServiceMode ...
- [WCF REST] Web消息主体风格(Message Body Style)
对于Web HTTP编程模型来说,服务契约中作为操作的方法无须应用OperationContractAttribute特性,只需要根据需要应用WebGetAttribute与WebInvokeAttr ...
- WCF之MSMQ消息队列
一.MSMQ简介 MSMQ(微软消息队列)是Windows操作系统中消息应用程序的基础,是用于创建分布式.松散连接的消息通讯应用程序的开发工具. MSMQ与XML Web Services和.Net ...
随机推荐
- mmc一维下料例子
数据来自维基, 长度 = 5600; l切割长度= {1380, 1520, 1560, 1710, 1820, 1880, 1930, 2000, 2050, 2100, 2140, 215 ...
- sizeof,终极无惑(上)
0. 前向声明 sizeof,一个其貌不扬的家伙,引无数菜鸟竟折腰,小虾我当初也没少犯迷糊,秉着“辛苦我一个,幸福千万人”的伟大思想,我决定将其尽可能具体的总结一下. 但当我总结的时候才发现,这个问题 ...
- C++ 表达式语句 海伦的故事
C++ 表达式语句 海伦的故事 摘要: 原创出处: http://www.cnblogs.com/Alandre/ 泥沙砖瓦浆木匠 希望转载,保留摘要,谢谢! 把今天当成最后一天来过.-海伦 请读者在 ...
- 从数据库中,绑定JQuery Accordion控件---Repeater control
http://aspsnippets.com/Articles/jQuery-Accordion-example-in-ASPNet-using-C-and-VBNet.aspx 1. 添加JQuer ...
- c++,多继承造成的二义性及解决办法
#include <iostream> using namespace std; //------------------------------- class A1{ public: i ...
- ZOJ 2856 Happy Life 暴力求解
因为是Special Judge 的题目,只要输出正确答案即可,不唯一 暴力力求解, 只要每次改变 happiness 值为负的人的符号即可. 如果计算出当前人的 happiness 值为负,那么将其 ...
- QuartusII 中使用Modelsim对子程序进行仿真
QuartusII 中使用Modelsim对子程序进行仿真 如果采用RTL级仿真那么就没有任何问题,但是如果对子程序采用门级仿真就会出错 解决办法:在Project Navigator中右键需要进行门 ...
- POJ2485——Highways
Description The island nation of Flatopia is perfectly flat. Unfortunately, Flatopia has no public h ...
- MapReduce调度与执行原理之任务调度(续)
前言 :本文旨在理清在Hadoop中一个MapReduce作业(Job)在提交到框架后的整个生命周期过程,权作总结和日后参考,如有问题,请不吝赐教.本文不涉及Hadoop的架构设计,如有兴趣请参考相关 ...
- 构件图(Component Diagram)—UML图(八)
构件图是显示代码自身结构的实现级别的图表.构件图由诸如源码文件.二进制代码文件.可运行文件或动态链接库 (DLL) 这种构件构成,并通过依赖关系相连接 以下这张图介绍了构件图的基本内容: 以下这张图是 ...