在 WCF 服务中使用 protobuf

Posted

技术标签:

【中文标题】在 WCF 服务中使用 protobuf【英文标题】:Using protobuf in WCF services 【发布时间】:2010-10-21 20:20:54 【问题描述】:

我的 asp.net 网页位于 IIS Web 服务器上,它使用基本的 HTTP 绑定与 WCF 服务(位于 windows 2008 应用服务器上)进行通信。 我的 wcf 服务的性能似乎不是那么好,我想改进它。另外,我需要平衡可伸缩性,因为我的网站将有非常高的流量。

HTTP 压缩、节流是一些我知道但还没有尝试过的方法.. 我可以使用protobuf API...请建议...

【问题讨论】:

【参考方案1】:

简短的回答是“是”...

protocol buffers 规范本身不提供 RPC 堆栈,但在规范之外添加了一些。

首先,protobuf-net 具有 WCF 挂钩,允许您将服务合同上的操作标记为 ProtoBehavior。然后交换常规的 DataContractSerializer 以使用 protobuf-net 序列化。但是,有一些警告:

您的数据成员必须有明确的顺序(例如[ProtoMember(Order = 1)]),因为它使用这些数字作为字段标识符(协议缓冲区使用数字字段) 它最适用于程序集/类共享(服务合同等),因为这种自定义行为不会在“mex”上公开

与基本 http 传输一起使用时,它还与 MTOM(如果启用)兼容,以实现最大吞吐量。重要消息的性能在很大程度上与它们的大小成正比;您可以了解 protobuf-net 的大小here。

另外,我也在开发一个定制的 RPC 堆栈。 current build 有一个基于 http 的工作堆栈,但我也计划在有机会时在原始 TCP/IP 上启用它。我还没有机会写出来,但我可以根据要求提供示例。请注意,要最方便地使用它,您还需要 3.5“扩展”dll。

如有任何问题,请添加评论或给我发电子邮件(查看我的个人资料)。

【讨论】:

如果消息是原始数据类型怎么办?它仍然取代行为吗?例如,如果您要返回一个双精度数组,它是作为序列化字节发送的吗?在这种情况下你需要程序集共享吗?此外,您说它最适合装配共享。那么如果客户不知道 PortoMember 订单,它会如何表现呢?【参考方案2】:

如果 WCF 服务不需要暴露在内部网络之外,您也可以考虑使用基于 TCP 的绑定。

【讨论】:

【参考方案3】:

见protobuf-net。

protobuf-net 是一个 .NET 实现,允许你 高效、轻松地序列化您的 .NET 对象。它是兼容的 与大多数 .NET 系列,包括 .NET 2.0/3.0/3.5、.NET CF 2.0/3.5、Mono 2.x、Silverlight 2 等

【讨论】:

感谢您的回答...请问您是否已经使用过 protobuf 以及看到了多少性能提升? 实际上 Marc,该库的作者在 *** 上的某个地方。我会给他发电子邮件并指出他的问题:) 澄清一下,我只是“protobuf-net”的作者; “协议缓冲区”是 Google 一些非常聪明的人的功劳。

以上是关于在 WCF 服务中使用 protobuf的主要内容,如果未能解决你的问题,请参考以下文章

在 WCF 服务中使用 protobuf

如何在android中使用WCF服务?

在 ClassLibrary 中使用 WCF 服务时出错

WCF / WCF Ria 服务在“IncludedResults”中返回关系数据

WCF 服务合同不匹配

在 WCF 数据服务中使用枚举