为什么我的WCF服务器使用protobuf-net返回空响应?

时间:2009-10-22 16:36:40

标签: .net wcf protobuf-net

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

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

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

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

  • 更新了我的服务参考

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

[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调用返回的null对象

  • 我已将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

2 个答案:

答案 0 :(得分:0)

抱歉延迟 - 工作时间等等。双方都知道这个变化吗?不幸的是,WCF集成在客户端与“mex”生成的代理不能很好地协作,但在汇编共享时可以正常工作。

或者,正在进行一些工作以使用可在配置中指定的端点行为;这不是100%,但应该很快 - 并且允许WCF透明地使用protobuf-net,而不会对服务合同产生任何影响(尽管成员仍需要通过[ProtoMember(n)]等了解它,或[DataMember(Order=n)]

答案 1 :(得分:0)

我在这方面做了一些工作,我怀疑问题是你有服务引用(通过IDE或通过svcutil),即使是 它重新使用共享数据契约,导致契约接口被复制(并丢失行为属性,使其破坏)。

选项:

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

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