【问题标题】:WCF client does not assert that message is serializableWCF 客户端不断言消息是可序列化的
【发布时间】:2025-12-23 14:15:11
【问题描述】:

我正在向 WCF 服务发送一个对象。客户端和服务端的 DataContractSerializer 都不知道 不知道该对象。 在这种情况下,我希望在客户端收到序列化错误,但是客户端发送成功,我只收到服务没有响应(在发送超时之后)。 我检查了 WCF 跟踪,发现服务器端存在反序列化失败。

如何强制 WCF 客户端验证要发送的对象是否可以序列化?

更新: 在尝试在一个简单的场景中重现该问题时,我设法将其隔离为与“ReliableSession”配置选项相关。仅当在客户端或服务器端启用可靠会话时才会出现此问题。

请参考此要点进行演示: https://gist.github.com/2291505

【问题讨论】:

    标签: wcf serialization datacontractserializer


    【解决方案1】:

    WCF 使用的DataContractSerializer 是一个“退出”序列化程序,它将尝试序列化您提供给它的所有对象,无论它们是否标有[DataContract] 属性。阻止它的唯一方法是使用[IgnoreDataMember] 属性显式标记您的对象。

    有关DataContractSerializer 将如何序列化您的类型的更多信息,请参阅here

    显然,您的客户端正在设法序列化 OK,否则 WCF 会出错,但我认为服务器端并不期待您发送的内容。你能提供任何错误信息吗?

    编辑: 我怀疑这是因为您发送的是未知类型。服务端知道字符串,因此可以成功反序列化它们,但对 Person 对象一无所知,因此不知道如何处理它。 (客户端确实知道 Person 是什么,因此可以很好地对其进行序列化)。

    尝试将[ServiceKnownType(typeof(Person))] 添加到您的服务定义中。显然,服务需要访问 Person 对象才能进行编译。

    【讨论】:

    • 我做了一个问题的代码示例。请查看我更新的问题。
    • 实际上我想要实现的是在这种情况下(尝试发送未知类型时)将在客户端识别序列化异常。我仍然无法理解为什么 ReliableSession 会影响所需的行为。