【问题标题】:Why is my WCF server returning empty responses using protobuf-net?为什么我的 WCF 服务器使用 protobuf-net 返回空响应?
【发布时间】:2009-10-22 16:36:40
【问题描述】:

我更新了现有的 WCF 应用程序以添加 protobuf-net 支持。 基本上,我已经:

  • 在包含我的所有数据对象的程序集中添加了 protobuf-net.dll (.net 3.0) 作为引用。我的服务器和客户端都引用了这个程序集

  • 将 [DataMember] 替换为 [DataMember(Order = x)](使用递增的整数作为 x)

  • 使用 ProtoBehavior 属性更新了我的所有 OperationContract

  • 更新了我的服务参考

从客户端,我在服务器上调用这个方法:

[OperationContract(IsOneWay = false), ProtoBehavior]
ConnectionData Join(string userId, string Password);

ConnectionData 是这样定义的:

[DataContract]
public class ConnectionData
{
    [DataMember(Order = 1)]
    public ConnectionStatusEnum ConnectionStatus; // this is a normal enum with five elements

    // .....

    [DataMember(Order = 5)]
    public bool MustChangePassword;
}

现在,这是发生了什么:

  • 如果我调试服务器,我看到 ConnectionData 对象已正确初始化并在 Join 方法中返回

  • 如果我调试客户端,我看到我的 Join 调用返回了一个空对象

  • 我已将 WCF 跟踪启用到最大详细程度,服务器日志中没有引起我注意,但在客户端日志文件中我看到了以下警告消息:

System.Runtime.Serialization.ElementIgnored
一个无法识别的元素是 在 XML 中遇到 被忽略的反序列化。
元素http://tempuri.org/:proto

我已经嗅探了我的网络流量,我不怪 protobuf-net 无法反序列化它:

<s:Body><JoinResponse xmlns="http://tempuri.org/"><proto/></JoinResponse></s:Body>

如何进一步解决问题并让 protobuf-net 正确序列化我的消息?


我正在使用 protobuf-net r275

【问题讨论】:

标签: .net wcf protobuf-net


【解决方案1】:

抱歉耽搁了-工作时间等。两端都知道这个变化吗?不幸的是,WCF 集成在客户端与“mex”生成的代理配合得不是很好,但与程序集共享配合得很好。

另外,还有一些工作正在进行中,以使用可以在配置中指定的端点行为;这不是 100%,但应该很快 - 并允许 WCF 透明地使用 protobuf-net,无需修改服务合同(尽管成员仍然需要了解它,通过 [ProtoMember(n)] 等或 @ 987654322@.

【讨论】:

  • 嗨,马克;感谢您的快速回答。共享程序集(这是迄今为止唯一修改过的程序集)、客户端和服务器位于一个 .sln 中,并且都引用了共享程序集项目。这能回答你的问题吗?
  • re app.config 支持,如果我理解正确的话,这绝对是一个非常好的补充,因为它允许为客户端提供一个 Soap 和一个启用 protobuf 的服务,以及一个单一的服务定义。
  • 确实...我会尝试将上述内容放入某些内容中以尝试重现它。
【解决方案2】:

我在这方面做了更多的工作,我怀疑问题是您有一个服务引用(通过 IDE 或通过 svcutil),尽管 它重用了共享数据合约,导致合约接口被复制(并丢失了行为属性,使其损坏)。

选项:

  • 不要使用服务引用(直接使用通道,或子类ClientBase&lt;T&gt;
  • 使用新的endpoint configuration options
  • 破解生成的界面以包含行为(造成维护问题)

如果您不熟悉它们,我计划在接下来的几天内为第一个选项写一篇博客文章。

【讨论】:

  • @Marc:感谢您的支持和时间。我会尝试 .config 的东西,并希望确认它解决了问题:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-16
  • 2012-11-01
  • 1970-01-01
  • 2021-04-15
相关资源
最近更新 更多