我所谓共和国里的美德,是指爱祖国也就是爱平等而言。这并不是一种道德上的美德,也不是一种基督教的美德,而是政治上的美德。——孟德斯鸠(上海网站建设)
WCF RESTful办事的Google Protocol Buffers超媒体类型
Admin
2012年1月22日
Protocol Buffers 是在一个很幻想的布局化数据的说话中立的序列化格局。你可以推敲一下XML或JSON,但更轻,更小的和谈缓冲区。 这种格局的广应用于谷歌不合的体系之间互换数据。 因为其布局化数据的最佳发挥解析,protocol buffers 是一个代表RESTful办事处理惩罚的数据很好的选择。要遵守REST的原则, protocol buffers 应作为一个新的超媒体类型的代表。 在当前版本(.NET 4) 的Windows通信根蒂根基(WCF),包含一个新的媒体类型,须要相当数量的尽力。 荣幸的是,新版本的WCF HTTP客栈,使媒体类型的WCF编程模型的一等公民,大师可以Glenn Block’s 博客去懂得更具体的内容。推荐大师假期可以看下这本书《REST实战》http://book.douban.com/subject/6854551/ 下面我们来介绍如何应用Google Protocol Buffers,只定义一个超媒体类型 ProtoBufferFormatter: 自定义超媒体类型是经由过程创建自定义的MediaTypeFormatter,实现OnWritetoStream() 和 OnReadFromStream() 办法进行序列化和反序列化处理惩罚。人们经常认为媒体类型只是在办事端应用,然则它用来在客户端把握序列化和反序列化的请求,下图显示了一个HTTP 恳求/响应和媒体类型格局化扮演的角色: 这个例子我们应用入门:构建简单的Web API 的代码和WCF Web API Preview 6。应用的媒体类型是application/x-protobuf ,REST办事的核心原则就是办事器和客户端之间的松耦合性,客户端须要知道书签的URI,但不该该知道任何其他的URI的常识,然则客户端必须知道链接关系。 下面的代码是自定义的ProtoBufferFormatter,机关函数里指了然支撑的媒体类型 application/x-protobuf。 using System; using System.Collections.Generic; using System.Linq; using System.Web; using System.Net.Http.Formatting; using System.IO; using ProtoBuf; using ProtoBuf.Meta; namespace WcfWebFormat.Formatters { &#160;&#160;&#160; public class ProtoBufferFormatter : MediaTypeFormatter &#160;&#160;&#160; { &#160;&#160;&#160;&#160;&#160;&#160;&#160; public ProtoBufferFormatter() &#160;&#160;&#160;&#160;&#160;&#160;&#160; { &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; this.SupportedMediaTypes.Add(new System.Net.Http.Headers.MediaTypeHeaderValue("application/x-protobuf")); &#160;&#160;&#160;&#160;&#160;&#160;&#160; } &#160;&#160;&#160;&#160;&#160;&#160;&#160; protected override void OnWriteToStream(Type type, object value, Stream stream, System.Net.Http.Headers.HttpContentHeaders contentHeaders, System.Net.TransportContext context) &#160;&#160;&#160;&#160;&#160;&#160;&#160; { &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Serializer.Serialize(stream, value);&#160; &#160;&#160;&#160;&#160;&#160;&#160;&#160; } &#160;&#160;&#160;&#160;&#160;&#160;&#160; protected override object OnReadFromStream(Type type, Stream stream, System.Net.Http.Headers.HttpContentHeaders contentHeaders) &#160;&#160;&#160;&#160;&#160;&#160;&#160; { &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; object obj = (RuntimeTypeModel.Default).Deserialize(stream, null, type); &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; return obj; &#160;&#160;&#160;&#160;&#160;&#160;&#160; } &#160;&#160;&#160; } } 如上所示,我们在OnWriteToStream办法中将.NET对象序列化为ProtoBuf格局,在OnReadFromStream办法中将ProtoBuf格局饭序列化为.NET对象。 如今须要给我们的.NET对象参加ProtoBuf 序列化的标签: using System.Collections.Generic; using System.Xml.Serialization; using ProtoBuf; namespace ContactManager.Resources { &#160;&#160;&#160; [ProtoContract] &#160;&#160;&#160; public class Contact &#160;&#160;&#160; { &#160;&#160;&#160;&#160;&#160;&#160;&#160; [ProtoMember(1)] &#160;&#160;&#160;&#160;&#160;&#160;&#160; public int ContactId { get; set; } &#160;&#160;&#160;&#160;&#160;&#160;&#160; [ProtoMember(2)] &#160;&#160;&#160;&#160;&#160;&#160;&#160; public string Name { get; set; } &#160;&#160;&#160; } } 把ProtoBufferFormatter 参加到WCF运行时的超媒体类型凑集里。 using Microsoft.ApplicationServer.Http; using WcfWebFormat.Formatters; namespace ContactManager { &#160;&#160;&#160; public class ContactManagerConfiguration : HttpConfiguration &#160;&#160;&#160; { &#160;&#160;&#160;&#160;&#160;&#160;&#160; public ContactManagerConfiguration() &#160;&#160;&#160;&#160;&#160;&#160;&#160; { &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; this.Formatters.Add(new ProtoBufferFormatter()); &#160;&#160;&#160;&#160;&#160;&#160;&#160; } &#160;&#160;&#160; } } 批改办事设备,应用ContactManagerConfiguration: var config = new ContactManagerConfiguration() { EnableTestClient = true }; routes.Add(new ServiceRoute("api/contacts", new HttpServiceHostFactory() { Configuration = config }, typeof(ContactsApi))); 在客户端调用的代码如下: &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; var serviceUri = new Uri("http://localhost:9000/api/contacts/"); &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; var httpClient = new HttpClient(); &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; httpClient.BaseAddress = serviceUri; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; httpClient.DefaultRequestHeaders.Accept.Add(new System.Net.Http.Headers.MediaTypeWithQualityHeaderValue("application/x-protobuf")); &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; var response = httpClient.GetAsync("1").Result; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; Contact obj = (RuntimeTypeModel.Default).Deserialize(response.Content.ReadAsStreamAsync().Result, null, typeof(Contact)) as Contact; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; var formatters = new MediaTypeFormatterCollection() { new ProtoBufferFormatter() }; &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; var content = new ObjectContent<Contact>(obj, "application/x-protobuf",formatters); &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; content.Headers.ContentType = new MediaTypeHeaderValue("application/x-protobuf"); &#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160;&#160; httpClient.PostAsync(serviceUri,content); 即使今朝来说Google Protocol Buffers没有XML/JSON那样普及,RESTful办事应用中ProtoBuf无疑是一个很是有效的超媒体类型。祝大师龙年新春兴奋,吉利如意! 相干文章: - 软件体系开辟中的数据互换和谈
- .net自带二进制序列化,XML序列化和ProtoBuf序列化的紧缩对比
- Android上GTalk以及Push机制的XMPP数据选择应用protobuf格局而非XML
- Leverage T4Scaffolding for WCF Web API
作者: 自由、创新、研究、摸索&#8230;&#8230;
出处:http://shanyou.cnblogs.com/
版权:本文版权归作者和博客园共有
转载:迎接转载,为了保存作者的创作热忱,请按请求【转载】,感谢
请求:未经作者赞成,必须保存此段声明;必须在文章中给出原文连接;不然必究法令义务
|