WCF use ProtoBuf

    ProtoBuf有着超高的传输效率, 可以替代WCF的xml和二进制编码, 可以试一试

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

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

    使用nuget安装proto-net, 为什么不用最新的 2.1.0 版本呢? 因为要弹出错误 protobuf-net”已拥有为“NETStandard.Library”定义的依赖项。

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

    注册 行为扩展: 将下面的代码拷贝到<system.serviceModel>下面

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

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

      <endpointBehaviors>
        <behavior name="protoEndpointBehavior">
          <protobuf/>
        </behavior>
      </endpointBehaviors>

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

behaviorConfiguration="protoEndpointBehavior"

    App.config最终样子

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.web>
    <compilation debug="true" />
  </system.web>
  <system.serviceModel>
    <extensions>
      <behaviorExtensions>
        <add name="protobuf" type="ProtoBuf.ServiceModel.ProtoBehaviorExtension, protobuf-net, Version=2.0.0.668, Culture=neutral, PublicKeyToken=257b51d87d2e4d67" />
      </behaviorExtensions>
    </extensions>
    <services>
      <service name="WcfServiceLibrary1.Service1">
        <endpoint address="" behaviorConfiguration="protoEndpointBehavior"
          binding="basicHttpBinding" contract="WcfServiceLibrary1.IService1">
          <identity>
            <dns value="localhost" />
          </identity>
        </endpoint>
        <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" />
        <host>
          <baseAddresses>
            <add baseAddress="http://localhost:8733/Design_Time_Addresses/WcfServiceLibrary1/Service1/" />
          </baseAddresses>
        </host>
      </service>
    </services>
    <behaviors>
      <endpointBehaviors>
        <behavior name="protoEndpointBehavior">
          <protobuf/>
        </behavior>
      </endpointBehaviors>
      <serviceBehaviors>
        <behavior>
          <serviceMetadata httpGetEnabled="True"/>
          <serviceDebug includeExceptionDetailInFaults="False" />
        </behavior>
      </serviceBehaviors>
    </behaviors>
  </system.serviceModel>
</configuration>

    配置文件写好了后, 还需要修改IServer.cs, 这里只是介绍, 只将 CompositeType 作为例子, 需要添加ProtoContract、ProtoMember 两种特性

    [DataContract]
    [ProtoContract]
    public class CompositeType
    {
        bool boolValue = true;
        string stringValue = "Hello ";

        [DataMember]
        [ProtoMember(1)]

        public bool BoolValue
        {
            get { return boolValue; }
            set { boolValue = value; }
        }

        [DataMember]
        [ProtoMember(2)]
        public string StringValue
        {
            get { return stringValue; }
            set { stringValue = value; }
        }
    }
    public interface IService1 也要添加 [ServiceContract] 特性

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

   客户端也要增加刚才的扩展和终结点行为, 最终App.config 是这样的

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
    <system.serviceModel>
      <extensions>
        <behaviorExtensions>
          <add name="protobuf" type="ProtoBuf.ServiceModel.ProtoBehaviorExtension, protobuf-net, Version=2.0.0.668, Culture=neutral, PublicKeyToken=257b51d87d2e4d67" />
        </behaviorExtensions>
      </extensions>
        <bindings>
            <basicHttpBinding>
                <binding name="BasicHttpBinding_IService1" />
            </basicHttpBinding>
        </bindings>
        <client>
            <endpoint address="http://localhost:8733/Design_Time_Addresses/WcfServiceLibrary1/Service1/"
                behaviorConfiguration="protoEndpointBehavior" binding="basicHttpBinding"
                bindingConfiguration="BasicHttpBinding_IService1" contract="ServiceReference1.IService1"
                name="BasicHttpBinding_IService1" />
        </client>
      <behaviors>
        <endpointBehaviors>
          <behavior name="protoEndpointBehavior">
            <protobuf />
          </behavior>
        </endpointBehaviors>
      </behaviors>
    </system.serviceModel>
</configuration>

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

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

可得到结果是null

查看别人的博文, 原来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

 

代码

时间: 2024-12-06 13:07:44

WCF use ProtoBuf的相关文章

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

Google 刚刚开源了grpc,  一个基于HTTP2 和 Protobuf 的高性能.开源.通用的RPC框架.Protobuf 本身虽然提供了RPC  的定义语法,但是一直以来,Google 只开源了Protobuf 序列化反序列化的代码,而没有开源RPC 的实现,于是存在着众多良莠不齐的第三方RPC 实现,不过我在项目中采用WCF搭配Protobuf是一个很不错的RPC实现,Google这个框架是是基于HTTP2的,这是他有特色的地方,带来诸如双向流.流控.头部压缩.单TCP连接上的多复用

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

一.前言 我们都知道 protobuf是由Google开发的一款与平台无关,语言无关,可扩展的序列化结构数据格式,可用做数据存储格式, 通信协议 ! 在前面<.NET开源Protobuf-net组件修炼手册>基础入门课程中我们已经对Google的Protobuf有了一个比较全面的了解和认识,本次高级进修课程主要的侧重点是讲解 Protobuf 通信协议应用. 那么 Protobuf 通信协议的应用将在本次分享课程进行讲解. 我们应用程序如何实现基于Protobuf协议的通信呢?阿笨本次分享课程

WCF服务上应用protobuf z

protobuf是google提供的一个开源序列化框架,类似于XML,JSON这样 的数据表示语言,其最大的特点是基于二进制,因此比传统的XML表示高效短小得多.虽然是二进制数据格式,但并没有因此变得复杂,开发人员通过按照一定的 语法定义结构化的消息格式,然后送给命令行工具,工具将自动生成相关的类,可以支持java.c++.python等语言环境.通过将这些类包含在项目 中,可以很轻松的调用相关方法来完成业务消息的序列化与反序列化工作. protobuf在google中是一个比较核心的基础库,作

选择Web API还是WCF

ASP.NET WCF是.NET平台服务开发的一站式框架,那么为什么还要有ASP.NET Web API呢?简单来说,ASP.NET Web API的设计和构建只考虑了一件事情,那就是HTTP,而WCF的设计主要是考虑SOAP和WS-*. WCF已经出现好多年了,相对来说ASP.NET Web API还是个小孩子,但是不意味着ASP.NET Web API要代替WCF,在不同的场合,它们各有长处.ASP.NET Web API非常轻量,在功能和灵活性上都不能和WCF相比.如果你的服务是基于TCP

WCF与Web API 区别(应用场景)

小分享:我有几张阿里云优惠券,用券购买或者升级阿里云相应产品最多可以优惠五折!领券地址:https://promotion.aliyun.com/ntms/act/ambassador/sharetouser.html?userCode=ohmepe03 Web api  主要功能: 支持基于Http verb (GET, POST, PUT, DELETE)的CRUD (create, retrieve, update, delete)操作 请求的回复格式支持 JSON,XML,并且可以扩展添

【转】WCF与Web API 区别(应用场景)

Web api  主要功能: 支持基于Http verb (GET, POST, PUT, DELETE)的CRUD (create, retrieve, update, delete)操作 请求的回复格式支持 JSON,XML,并且可以扩展添加其他格式. .请求的回复通过Http Status Code表达不同含义,并且客户端可以通过Accept header来与服务器协商格式,例如你希望服务器返回JSON格式还是XML格式 应用场景: 如果服务需要在http协议上,并且希望利用http协议的

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

原文:http://blog.csdn.net/kakashi8841/article/details/17334493 前几天有位网友问我关于Unity3D里面使用Protobuf的方法,一时有事拖到现在才写这篇文章,不好意思哈. 本文测试环境: 系统:WINDOWS 7(第3.6步).OS X 10.9(第4步) 软件:VS 2012(第3.6步).Eclipse(第5.6步) 硬件:iPad 2(第4步).Macbook Pro Mid 2012(第4步) 文章目录: 1.关于Protob

WCF与Web API在应用上的选择

在最近发布的Visual  Studio 2012及.NET 4.5中, 微软正式推出新的网络服务框架ASP.NET Web API.作为ASP.NET MVC  4的一部分,ASP.NET Web API这套开源框架的设计目的是简化RESTful服务的开发和使用. ASP.NET Web API 与之前的内建HTTP服务解决方案的不同之处在于,它一开始就是围绕HTTP协议及其消息语义构建起来的.与WCF  REST或ASP.NET AJAX加ASMX相比,它不是对现有框架的增强,而是一个全新的

ASP.NET Web API——选择Web API还是WCF

WCF是.NET平台服务开发的一站式框架,那么为什么还要有ASP.NET Web API呢?简单来说,ASP.NET Web API的设计和构建只考虑了一件事情,那就是HTTP,而WCF的设计主要是考虑SOAP和WS-*. WCF已经出现好多年了,相对来说ASP.NET Web API还是个小孩子,但是不意味着ASP.NET Web API要代替WCF,在不同的场合,它们各有长处.ASP.NET Web API非常轻量,在功能和灵活性上都不能和WCF相比.如果你的服务是基于TCP的,或者支持更多