ProtoBuf, 比起xml和json, 传输的数据里面没有自描述标签, 而且是基于二进制的, 所以有着超高的传输效率, 据牛人张善友的描述, 可以替代WCF的自带的编码方案, 效率有极大的提升.

    在网上搜罗了一遍, 很多博文都是复制张善友的文章, 有些细节没有说清楚, 所以将自己尝试的方法分享给大家.

 

    1. 在VS2013中新建一个 WCF服务库, 名字使用默认的WcfServiceLibrary1

    2. 在当前解决方案再新建一个Console程序, 名字叫Client

    3. 使用nuget安装proto-net, 为什么不用最新的 2.1.0 版本呢? 因为要弹出错误 protobuf-net”已拥有为“NETStandard.Library”定义的依赖项。我估计应该是转.Net Core了, 没有继续研究了, 先用 2.0.0.668 吧

Install-Package protobuf-net -Version 2.0.0.668 -ProjectName WcfServiceLibrary1

Install-Package protobuf-net -Version 2.0.0.668 -ProjectName Client

    将WcfServiceLibrary1\packages\protobuf-net.2.0.0.668\lib\net40\protobuf-net.dll拷贝到

\WcfServiceLibrary1\WcfServiceLibrary1

WcfServiceLibrary1\Client

    4. 在服务端注册 行为扩展: 将下面的代码拷贝到<system.serviceModel>下面, 注册行为扩展的时候要求protobuf-net.dll就放在项目文件夹, 这就是第3步拷贝的原因

  1. <extensions>
  2. <behaviorExtensions>
  3. <add name="protobuf" type="ProtoBuf.ServiceModel.ProtoBehaviorExtension, protobuf-net, Version=2.0.0.668, Culture=neutral, PublicKeyToken=257b51d87d2e4d67" />
  4. </behaviorExtensions>
  5. </extensions>

    5. 在服务端将 行为扩展 应用在 终结点行为 上: 在<behaviors>下面拷贝

  1. <endpointBehaviors>
  2. <behavior name="protoEndpointBehavior">
  3. <protobuf/>
  4. </behavior>
  5. </endpointBehaviors>

    6. 还有就是让服务使用这个终结点行为, 在 <endpoint> 下添加

behaviorConfiguration="protoEndpointBehavior"

    App.config最终样子

  1. <?xml version="1.0" encoding="utf-8" ?>
  2. <configuration>
  3. <system.web>
  4. <compilation debug="true" />
  5. </system.web>
  6. <system.serviceModel>
  7. <extensions>
  8. <behaviorExtensions>
  9. <add name="protobuf" type="ProtoBuf.ServiceModel.ProtoBehaviorExtension, protobuf-net, Version=2.0.0.668, Culture=neutral, PublicKeyToken=257b51d87d2e4d67" />
  10. </behaviorExtensions>
  11. </extensions>
  12. <services>
  13. <service name="WcfServiceLibrary1.Service1">
  14. <endpoint address="" behaviorConfiguration="protoEndpointBehavior"
  15. binding="basicHttpBinding" contract="WcfServiceLibrary1.IService1">
  16. <identity>
  17. <dns value="localhost" />
  18. </identity>
  19. </endpoint>
  20. <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
  21. <host>
  22. <baseAddresses>
  23. <add baseAddress="http://localhost:8733/Design_Time_Addresses/WcfServiceLibrary1/Service1/" />
  24. </baseAddresses>
  25. </host>
  26. </service>
  27. </services>
  28. <behaviors>
  29. <endpointBehaviors>
  30. <behavior name="protoEndpointBehavior">
  31. <protobuf/>
  32. </behavior>
  33. </endpointBehaviors>
  34. <serviceBehaviors>
  35. <behavior>
  36. <serviceMetadata httpGetEnabled="True"/>
  37. <serviceDebug includeExceptionDetailInFaults="False" />
  38. </behavior>
  39. </serviceBehaviors>
  40. </behaviors>
  41. </system.serviceModel>
  42. </configuration>

    7. 配置文件写好了后, 还需要修改IServer.cs, 这里只是简单例子, 就将 CompositeType 作为例子, 需要添加ProtoContract、ProtoMember 两种特性, 这样protobuf-net的编码器才能正确识别

  1. [DataContract]
  2. [ProtoContract]
  3. public class CompositeType
  4. {
  5. bool boolValue = true;
  6. string stringValue = "Hello ";
  7.  
  8. [DataMember]
  9. [ProtoMember(1)]
  10.  
  11. public bool BoolValue
  12. {
  13. get { return boolValue; }
  14. set { boolValue = value; }
  15. }
  16.  
  17. [DataMember]
  18. [ProtoMember(2)]
  19. public string StringValue
  20. {
  21. get { return stringValue; }
  22. set { stringValue = value; }
  23. }
  24. }
  1. 8. public interface IService1 还要要添加 [ServiceContract] 特性

    

    9. 客户端引用WCF服务, 因为WCF服务就在本项目, 所以要选择 解决方案中的服务, 就命名为ServiceReference1吧

   10. 客户端也要增加刚才的扩展和终结点行为, 这样客户端才能解析protobuf数据, 最终App.config 是这样的

  1. <?xml version="1.0" encoding="utf-8" ?>
  2. <configuration>
  3. <system.serviceModel>
  4. <extensions>
  5. <behaviorExtensions>
  6. <add name="protobuf" type="ProtoBuf.ServiceModel.ProtoBehaviorExtension, protobuf-net, Version=2.0.0.668, Culture=neutral, PublicKeyToken=257b51d87d2e4d67" />
  7. </behaviorExtensions>
  8. </extensions>
  9. <bindings>
  10. <basicHttpBinding>
  11. <binding name="BasicHttpBinding_IService1" />
  12. </basicHttpBinding>
  13. </bindings>
  14. <client>
  15. <endpoint address="http://localhost:8733/Design_Time_Addresses/WcfServiceLibrary1/Service1/"
  16. behaviorConfiguration="protoEndpointBehavior" binding="basicHttpBinding"
  17. bindingConfiguration="BasicHttpBinding_IService1" contract="ServiceReference1.IService1"
  18. name="BasicHttpBinding_IService1" />
  19. </client>
  20. <behaviors>
  21. <endpointBehaviors>
  22. <behavior name="protoEndpointBehavior">
  23. <protobuf />
  24. </behavior>
  25. </endpointBehaviors>
  26. </behaviors>
  27. </system.serviceModel>
  28. </configuration>

    11. 将解决方案设置为双启动, 右键解决方案 -->  属性 --> 启动项目 --> 多启动项目    

     11. 好了, 可以在客户端调用服务了

  1. static void Main(string[] args)
  2. {
  3. var proxy =new ServiceReference1.Service1Client();
  4. var result=proxy.GetDataUsingDataContract(new ServiceReference1.CompositeType(){ StringValue="test });
  5. Console.WriteLine(result.StringValue);
  6. }

但是得到结果是null

    12. 查看别人的博文 在Wcf中应用ProtoBuf替代默认的序列化器  , 原来protobuf 不是WCF的嫡出, 通过服务引用, 并不会像DataMember这种原生支持的Attribute那样, 把ProtoMember传输到Client的自动生成代码里, 所以还需要手工添加, 蛋疼啊

    在打开的Reference.cs中找到属性 public bool BoolValue   添加  [ProtoMember(1)]

    找到属性 public string StringValue 添加  [ProtoMember(2)]

     这下终于有结果了

 

 

 

     后记, protobuf 并不是为WCF准备的, 而是应该与 gRPC 配合使用, 在 gRPC 的示例文档中可以看到如将一个非常简单的 .proto文件编译成复杂的cs文件, 然后分别被服务端和客户端引用, 最终实现远程调用, 不过示例环境是VS2015

 

源代码

WCF use ProtoBuf的更多相关文章

  1. 谷歌发布的首款基于HTTP/2和protobuf的RPC框架:GRPC

    Google 刚刚开源了grpc,  一个基于HTTP2 和 Protobuf 的高性能.开源.通用的RPC框架.Protobuf 本身虽然提供了RPC  的定义语法,但是一直以来,Google 只开 ...

  2. 基于HTTP/2和protobuf的RPC框架:GRPC

    谷歌发布的首款基于HTTP/2和protobuf的RPC框架:GRPC Google 刚刚开源了grpc,  一个基于HTTP2 和 Protobuf 的高性能.开源.通用的RPC框架.Protobu ...

  3. .NET开源Protobuf-net组件葵花手册

    一.前言 我们都知道 protobuf是由Google开发的一款与平台无关,语言无关,可扩展的序列化结构数据格式,可用做数据存储格式, 通信协议 ! 在前面<.NET开源Protobuf-net ...

  4. .NET 开源Protobuf-net从入门到精通

    <.NET 开源Protobuf-net从入门到精通>课程包含以下两个部分: 一..NET 开源Protobuf-net组件[数据存储篇] 本次分享课程包含以下干货知识点: 1.什么是Pr ...

  5. 在Wcf中应用ProtoBuf替代默认的序列化器

    Google的ProtoBuf序列化器性能的牛逼已经有目共睹了,可以把它应用到Socket通讯,队列,Wcf中,身为dotnet程序员一边期待着不久后Grpc对dotnet core的支持更期待着Wc ...

  6. WCF服务上应用protobuf

    WCF服务上应用protobuf Web api  主要功能: 支持基于Http verb (GET, POST, PUT, DELETE)的CRUD (create, retrieve, updat ...

  7. WCF服务上应用protobuf z

    protobuf是google提供的一个开源序列化框架,类似于XML,JSON这样 的数据表示语言,其最大的特点是基于二进制,因此比传统的XML表示高效短小得多.虽然是二进制数据格式,但并没有因此变得 ...

  8. WCF与Web API 的应用场景

    Web api  主要功能: 支持基于Http verb (GET, POST, PUT, DELETE)的CRUD (create, retrieve, update, delete)操作 请求的回 ...

  9. Unity3D客户端和Java服务端使用Protobuf

    转自:http://blog.csdn.net/kakashi8841/article/details/17334493 前几天有位网友问我关于Unity3D里面使用Protobuf的方法,一时有事拖 ...

随机推荐

  1. MyBatis学习总结(七)——Mybatis缓存(转载)

      孤傲苍狼 只为成功找方法,不为失败找借口! MyBatis学习总结(七)--Mybatis缓存 一.MyBatis缓存介绍 正如大多数持久层框架一样,MyBatis 同样提供了一级缓存和二级缓存的 ...

  2. 基础篇-spring包的下载

    首先去到String官网 往下拉一点会看到如下图所示点击进入下一步 进入以后找到如下图所示的 然后按照下图所示操作 选择你想要的版本点击它 选择spring的完整包下载如图

  3. Action向前台输出

    import java.io.IOException;import java.io.PrintWriter; import javax.servlet.http.HttpServletResponse ...

  4. 【转】C#大文件读取和查询--内存映射

    笔者最近需要快速查询日志文件,文件大小在4G以上. 需求如下: 1.读取4G左右大小的文件中的指定行,程序运行占用内存不超过500M. 2.希望查询1G以内容,能控制在20s左右. 刚开始觉得这个应该 ...

  5. rt—移植笔记1

    将rtt源码往stm32f407移植的时候,源码串口打印引脚设置有误,以下是源码引脚配置. 以下是原理图 可见配置有误.

  6. js部分总结

    1 currentStyle 可以获取行间样式,但是不兼容 其他浏览器用getComputedStyle(div,null)这个ie低级版本不兼容; if(div.currentStyle){ } e ...

  7. EBS中启用OAF页面个性化三个配置

    启用OAF页面个性化三个配置(Profiles) FND:诊断英文为FND: Diagnostics,用于设置是否显示“关于此页” 个性化自助定义英文为Personalize Self-Service ...

  8. JPA merge(obj) 方法

    JPA中的merge类似Hibernate中的saveOrUpdate方法,当数据库中存在id=2的Person,在em.close()时会发送一条update语句,而当数据库中不存在id=2的Per ...

  9. elasticsearch5.0集群+kibana5.0+head插件插件的安装

    elasticsearch5.0集群+kibana5.0+head插件插件的安装 es集群的规划: 两台16核64G内存的服务器: yunva_etl_es1  ip:1.1.1.1 u04es01. ...

  10. Win8.1无法安装.NET Framework 3.5的解决办法

    这个问题纠结了我很多天,恢复系统也没用,差点儿就重装Win8,现在终于解决了,你也来试试吧! 机型:台电X89 系统:Win8.1 with bing 故障:在未安装.NET Framework 3. ...