当前位置: 首页 > news >正文

深圳市大鹏建设局网站网站标题优化

深圳市大鹏建设局网站,网站标题优化,吴江网页制作,美食网站开发的原则在前面两篇文章WCF进阶#xff1a;将消息正文Base64编码和WCF进阶:为每个操作附加身份信息中讲述了如何通过拦截消息的方式来记录或者修改消息#xff0c;这种方式在特定条件下可以改变消息编码格式#xff0c;但实现方式并不规范#xff0c;而且使用范围也有限制。 WCF缺省…  在前面两篇文章WCF进阶将消息正文Base64编码和WCF进阶:为每个操作附加身份信息中讲述了如何通过拦截消息的方式来记录或者修改消息这种方式在特定条件下可以改变消息编码格式但实现方式并不规范而且使用范围也有限制。 WCF缺省提供了三种编码器MessageEncoderTextMessageEncoderBinaryMessageEncoderMtomMessageEncoder。事实上也是基于XML可以有三种格式Text,Binary,MTOM而XmlDictionaryWriter也提供了三种创建Writer的方法CreateTextWriterCreateBinaryWriterCreateMtomWriter他们分别用于将XML以文本二进制MTOM保存。三种保存形式各有利弊Text便于理解更通用Binary体积小MTOM是优化之后的二进制适用于较大的二进制传输。但无论使用哪种最终在网络上传输的都是字节流或者叫字节数组。在Binding中处于最后一个的总是TransportBindingElement也就是说当要传递的数据到达TransportBindingElement之后其实已经是字节数组了。在TransportBindingElement之上可以有事务处理器会话处理器消息安全处理器编码器传输安全处理器等在编码器之前主要的处理对象是Message而之后主要的处理对象就是StreamByte[]从这点我们也就清楚了之前在学习安全体系的时候总是习惯将安全划分为消息级别的安全和传输级别安全两种了。我们这次要实现的其实是将已经经过编码器编码好的字节流压缩后传输而不是传统意义上的消息编码。这点也需要大家深层次的理解。   虽然我们实现的传输层面上的压缩编码但实现机理和自定义MessageEncoder是一样的MessageEncoder是所有编码器的基类它有几个非常重要的方法和属性 public abstract Message ReadMessage(ArraySegmentbyte buffer, BufferManager bufferManager, string contentType); public ArraySegmentbyte WriteMessage(Message message, int maxMessageSize, BufferManager bufferManager); // Properties public abstract string ContentType { get; } public abstract string MediaType { get; } public abstract MessageVersion MessageVersion { get; } ReadMessage和WriteMessage是完成消息 -字节数组转换的这两个方法还有几个重载在实现自定义编码器的时候是最为重要的我们主要是通过重写它们来完成自定义转换。上面我们也说过了我们要实现的是传输层的压缩编码那么需要有一个缺省编码为此我们设计了名为CompressEncoder的自定义编码类 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.ServiceModel.Channels; using System.IO;namespace RobinLib {public class CompressEncoder : MessageEncoder{CompressEncoderFactory factory;MessageEncoder innserEncoder;private CompressAlgorithm algorithm;public CompressEncoder(CompressEncoderFactory encoderFactory, CompressAlgorithm algorithm){factory encoderFactory;this.algorithm algorithm;innserEncoder factory.InnerMessageEncodingBindingElement.CreateMessageEncoderFactory().Encoder;}public override string ContentType{get { return innserEncoder.ContentType; }}public override string MediaType{get { return innserEncoder.MediaType; }}public override MessageVersion MessageVersion{get { return innserEncoder.MessageVersion; }}public override bool IsContentTypeSupported(string contentType){return innserEncoder.IsContentTypeSupported(contentType);}public override T GetPropertyT(){return innserEncoder.GetPropertyT();}public override Message ReadMessage(ArraySegmentbyte buffer, BufferManager bufferManager, string contentType){ArraySegmentbyte bytes new Compressor(algorithm).DeCompress(buffer);int totalLength bytes.Count;byte[] totalBytes bufferManager.TakeBuffer(totalLength);Array.Copy(bytes.Array, 0, totalBytes, 0, bytes.Count);ArraySegmentbyte byteArray new ArraySegmentbyte(totalBytes, 0, bytes.Count);bufferManager.ReturnBuffer(byteArray.Array); Message msg innserEncoder.ReadMessage(byteArray, bufferManager, contentType);return msg;}public override Message ReadMessage(System.IO.Stream stream, int maxSizeOfHeaders, string contentType){//读取消息的时候二进制流为加密的需要解压Stream ms new Compressor(algorithm).DeCompress(stream); Message msg innserEncoder.ReadMessage(ms, maxSizeOfHeaders, contentType);return msg;}public override ArraySegmentbyte WriteMessage(Message message, int maxMessageSize, BufferManager bufferManager, int messageOffset){ ArraySegmentbyte bytes innserEncoder.WriteMessage(message, maxMessageSize, bufferManager);ArraySegmentbyte buffer new Compressor(algorithm).Compress(bytes);int totalLength buffer.Count messageOffset;byte[] totalBytes bufferManager.TakeBuffer(totalLength);Array.Copy(buffer.Array, 0, totalBytes, messageOffset, buffer.Count);ArraySegmentbyte byteArray new ArraySegmentbyte(totalBytes, messageOffset, buffer.Count);Console.WriteLine(算法:algorithm,原来字节流大小:bytes.Count,压缩后字节流大小:byteArray.Count);return byteArray;}public override void WriteMessage(Message message, System.IO.Stream stream){System.IO.MemoryStream ms new System.IO.MemoryStream();innserEncoder.WriteMessage(message, ms);stream new Compressor(algorithm).Compress(ms);}} } 在这个类中需要知道上层编码器是什么我们用MessageEncoder innserEncoder来指定在WriteMessage时候将消息用内置编码器转换为字节数组然后用压缩算法压缩这个数组形成压缩后字节数组传递给到下一层而在读取Message的时候首先将收到的字节数组解压缩最后将解压缩后字节数组用内置编码器转换为Message对象。其中Compressor是一个功能类用于将字节数组压缩或者解压缩代码为 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.IO; using System.IO.Compression; namespace RobinLib {public class Compressor{private CompressAlgorithm algorithm;public Compressor(CompressAlgorithm algorithm){this.algorithm algorithm;}//压缩数组public ArraySegmentbyte Compress(ArraySegmentbyte data){MemoryStream ms new MemoryStream();if (algorithm CompressAlgorithm.GZip){Stream compressStream new GZipStream(ms, CompressionMode.Compress, true);compressStream.Write(data.Array, 0, data.Count);compressStream.Close();}else{Stream compressStream new DeflateStream(ms, CompressionMode.Compress, true);compressStream.Write(data.Array, 0, data.Count);compressStream.Close();}byte[] newByteArray new byte[ms.Length];ms.Seek(0, SeekOrigin.Begin);ms.Read(newByteArray, 0, newByteArray.Length);ArraySegmentbyte bytes new ArraySegmentbyte(newByteArray);return bytes;}//压缩流public Stream Compress(Stream stream){MemoryStream ms new MemoryStream();if (algorithm CompressAlgorithm.GZip){Stream compressStream new GZipStream(ms, CompressionMode.Compress, true);byte[] buffer new byte[stream.Length];stream.Read(buffer, 0, buffer.Length);compressStream.Write(buffer, 0, buffer.Length);compressStream.Close();}else{Stream compressStream new DeflateStream(ms, CompressionMode.Compress, true);byte[] buffer new byte[stream.Length];stream.Read(buffer, 0, buffer.Length);compressStream.Write(buffer, 0, buffer.Length);compressStream.Close();}return ms;}//解压缩数组public ArraySegmentbyte DeCompress(ArraySegmentbyte data){MemoryStream ms new MemoryStream();ms.Write(data.Array, 0, data.Count);ms.Seek(0, SeekOrigin.Begin);if (algorithm CompressAlgorithm.GZip){Stream compressStream new GZipStream(ms, CompressionMode.Decompress, false);byte[] newByteArray RetrieveBytesFromStream(compressStream, 1);compressStream.Close();return new ArraySegmentbyte(newByteArray);}else{Stream compressStream new DeflateStream(ms, CompressionMode.Decompress, false);byte[] newByteArray RetrieveBytesFromStream(compressStream, 1);compressStream.Close();return new ArraySegmentbyte(newByteArray);}}//解压缩数组public Stream DeCompress(Stream stream){stream.Seek(0, SeekOrigin.Begin);if (algorithm CompressAlgorithm.GZip){Stream compressStream new GZipStream(stream, CompressionMode.Decompress, false);byte[] newByteArray RetrieveBytesFromStream(compressStream, 1);compressStream.Close();return new MemoryStream(newByteArray);}else{Stream compressStream new DeflateStream(stream, CompressionMode.Decompress, false);byte[] newByteArray RetrieveBytesFromStream(compressStream, 1);compressStream.Close();return new MemoryStream(newByteArray);}}public static byte[] RetrieveBytesFromStream(Stream stream, int bytesblock){Listbyte lst new Listbyte();byte[] data new byte[1024];int totalCount 0;while (true){int bytesRead stream.Read(data, 0, data.Length);if (bytesRead 0){break;}byte[] buffers new byte[bytesRead];Array.Copy(data, buffers, bytesRead);lst.AddRange(buffers);totalCount bytesRead;}return lst.ToArray();}} } 到此其实我们的自定义编码器应该编写好了接下来如何使用它成为我们最为关心的事情。每一个MessageEncoder都对应一个MessageEncoderFactory在MessageEncodingBindingElement中能返回这个MessageEncoderFactory然后通过在自定义BindingElement创建监听通道BuildChannelListener和通道工厂BuildChannelFactory的时候将BindingElement添加到BindingContext这样就能最终消费我们上面实现的CompressEncoder。 CompressEncoderFactory的代码实现为 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.ServiceModel.Channels;namespace RobinLib {public class CompressEncoderFactory:MessageEncoderFactory{private MessageEncodingBindingElement innerMessageEncodingBindingElement;CompressEncoder messageEncoder;private CompressAlgorithm algorithm;public CompressEncoderFactory(MessageEncodingBindingElement innerMessageEncodingBindingElement, CompressAlgorithm algorithm){this.innerMessageEncodingBindingElement innerMessageEncodingBindingElement;this.algorithm algorithm;messageEncoder new CompressEncoder(this,algorithm);}public override MessageEncoder CreateSessionEncoder(){return base.CreateSessionEncoder();}public override MessageEncoder Encoder{get { return messageEncoder; }}public override MessageVersion MessageVersion{get { return innerMessageEncodingBindingElement.MessageVersion; }}public MessageEncodingBindingElement InnerMessageEncodingBindingElement{get{return innerMessageEncodingBindingElement;}}} } 自定义的MessageEncoderBindingElement代码为 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.ServiceModel.Channels; using System.ServiceModel; using System.Xml;namespace RobinLib {public sealed class CompressEncodingBindingElement : MessageEncodingBindingElement{ private XmlDictionaryReaderQuotas readerQuotas;private MessageEncodingBindingElement innerMessageEncodingBindingElement;private CompressAlgorithm algorithm;public MessageEncodingBindingElement InnerMessageEncodingBindingElement{get{return innerMessageEncodingBindingElement;}}public CompressAlgorithm CompressAlgorithm{get{return algorithm;}}public CompressEncodingBindingElement(MessageEncodingBindingElement innerMessageEncodingBindingElement, CompressAlgorithm algorithm){this.readerQuotas new XmlDictionaryReaderQuotas();this.algorithm algorithm;this.innerMessageEncodingBindingElement innerMessageEncodingBindingElement;}public override IChannelFactoryTChannel BuildChannelFactoryTChannel(BindingContext context){context.BindingParameters.Add(this);return context.BuildInnerChannelFactoryTChannel();}public override IChannelListenerTChannel BuildChannelListenerTChannel(BindingContext context){context.BindingParameters.Add(this);return context.BuildInnerChannelListenerTChannel();}public override bool CanBuildChannelFactoryTChannel(BindingContext context){context.BindingParameters.Add(this);return context.CanBuildInnerChannelFactoryTChannel();}public override bool CanBuildChannelListenerTChannel(BindingContext context){context.BindingParameters.Add(this);return context.CanBuildInnerChannelListenerTChannel();}public override MessageEncoderFactory CreateMessageEncoderFactory(){return new CompressEncoderFactory(innerMessageEncodingBindingElement,algorithm);}public override T GetPropertyT(BindingContext context) {if (typeof(T) typeof(XmlDictionaryReaderQuotas)){return this.readerQuotas as T;}return base.GetPropertyT(context);}public override MessageVersion MessageVersion{get{return innerMessageEncodingBindingElement.MessageVersion;}set{innerMessageEncodingBindingElement.MessageVersion value;}}public override BindingElement Clone(){return new CompressEncodingBindingElement(innerMessageEncodingBindingElement,algorithm);} } } 最终我们可以使用CustomeBinding创建宿主和客户端。 服务端 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.ServiceModel; using Robin_Wcf_CustomMessageEncoder_SvcLib; using System.ServiceModel.Channels; using RobinLib;namespace Robin_Wcf_CustomMessageEncoder_Host {class Program{static void Main(string[] args){//服务地址Uri baseAddress new Uri(http://127.0.0.1:8081/Robin_Wcf_Formatter);ServiceHost host new ServiceHost(typeof(Service1), new Uri[] { baseAddress });//服务绑定ICollectionBindingElement bindingElements new ListBindingElement();HttpTransportBindingElement httpBindingElement new HttpTransportBindingElement();CompressEncodingBindingElement textBindingElement new CompressEncodingBindingElement(new TextMessageEncodingBindingElement(),CompressAlgorithm.Deflate);bindingElements.Add(textBindingElement);bindingElements.Add(httpBindingElement);CustomBinding bind new CustomBinding(bindingElements); host.AddServiceEndpoint(typeof(IService1), bind, );if (host.Description.Behaviors.FindSystem.ServiceModel.Description.ServiceMetadataBehavior() null){System.ServiceModel.Description.ServiceMetadataBehavior svcMetaBehavior new System.ServiceModel.Description.ServiceMetadataBehavior();svcMetaBehavior.HttpGetEnabled true;svcMetaBehavior.HttpGetUrl new Uri(http://127.0.0.1:8001/Mex);host.Description.Behaviors.Add(svcMetaBehavior);}host.Opened new EventHandler(delegate(object obj, EventArgs e){Console.WriteLine(服务已经启动);}); host.Open();Console.Read();}} }   客户端 using System; using System.Collections.Generic; using System.Linq; using System.Text; using RobinLib; using System.ServiceModel.Channels; using Robin_Wcf_CustomMessageEncoder_ClientApp.ServiceReference1;namespace Robin_Wcf_CustomMessageEncoder_ClientApp {class Program{static void Main(string[] args){System.Threading.Thread.Sleep(5300);ICollectionBindingElement bindingElements new ListBindingElement();HttpTransportBindingElement httpBindingElement new HttpTransportBindingElement();CompressEncodingBindingElement textBindingElement new CompressEncodingBindingElement(new BinaryMessageEncodingBindingElement(), CompressAlgorithm.GZip);bindingElements.Add(textBindingElement);bindingElements.Add(httpBindingElement); CustomBinding bind new CustomBinding(bindingElements); ServiceReference1.IService1 svc new ServiceReference1.Service1Client(bind, new System.ServiceModel.EndpointAddress(http://127.0.0.1:8081/Robin_Wcf_Formatter));string pres svc.GetData(10);Console.WriteLine(pres);CompositeType ct svc.GetDataUsingDataContract(new CompositeType());System.IO.MemoryStream ms new System.IO.MemoryStream();for (int i 0; i 1000000; i){byte[] buffer BitConverter.GetBytes(i);ms.Write(buffer, 0, buffer.Length);}System.IO.Stream stream svc.GetStream(ms);Console.Read();}} } 我们可以更改CompressEncodingBindingElement textBindingElement new CompressEncodingBindingElement(new BinaryMessageEncodingBindingElement(), CompressAlgorithm.GZip);指定内置MessageEncoder和压缩算法。 最后附件一句不是所有的数组压缩后体积都变小的只有文本类型的压缩后效果比较明显。运行程序当内置TextMessageEncodingBindingElement的时候我们得到的效果为 此时说明压缩效果非常明显 而当内置BinaryMessageEncodingBindingElement的时候压缩效果不再突出甚至起到反作用。 如果有朋友需要使用压缩传输可以直接下载项目引用其中的RobinLib.dll然后使用自定义Binding。 项目文件/jillzhang/Robin_Wcf_CustomMessageEncoder.rar 下文我们将演示实现对称加密传输。转载于:https://www.cnblogs.com/jillzhang/archive/2010/04/13/1711079.html
http://www.huolong8.cn/news/40992/

相关文章:

  • 濮阳房产网站建设店铺推广软件
  • 有一个专门做lol同人的网站建筑专业律师事务所
  • 价值30万的网站建设什么网站系统做的最好的
  • 企业网站免费制作佛山房地产新闻
  • 卖东西的网站怎么建设网页图片怎么打印出来
  • 网页制作与网站建设技术详解自己做的网站403
  • 哪个网站能免费下载如何给自己网站做网站优化
  • 公司网站案例展示wordpress首页文章设置
  • 做信息类网站有哪些电子商务教材电子版
  • 北京seo顾问服务公司网站seo工作内容
  • 备案的域名做电影网站海口网站运营托管咨询
  • 大连企业网站制作行业关键词一览表
  • 免费设计装修网站汕头网站建设科技有限公司
  • 网站推广的搜索引擎推广市场策划是做什么的
  • 网站推广营销收费关键对话
  • 国家企业信息系统公示查询上海关键词优化推荐
  • 网站运行环境配置wordpress xydown
  • 免费设计海报网站赣州推广团队
  • 百度域名查询官网seo常用的优化工具
  • 网站建设预付费入什么科目浅谈学校网站建设
  • 有哪些可以做头像的网站网站开发的技术
  • 南平住房和城乡建设部网站wordpress如何发表新文章
  • 哪个网站可以做puzzlewordpress修改成中文字体
  • 长沙企业建站程序建设项目技术服务网站
  • 百度网站收录入口杭州网页设计公司
  • pa66用途障车做网站信息科技公司网站怎么做
  • 做校园文化的网站建站wordpress 基础
  • 网站后台管理员怎么做公司备案网站负责人是谁
  • 看那种片哪个网站好用泉州哪个公司网站做的好
  • 公司网站维护费怎么做分录如何在手机上编程游戏