0

我有一个 WCF 服务,它的操作可以接受任何 .net 可序列化客户端数据。

[OperationContract]
void SaveMyData(long id, string name, object serializableData);

[OperationContract]
object LoadMyData(long id, string name);

服务器不需要知道数据是什么,它只是存储它或返回存储的内容。而且服务器甚至不知道被序列化的类型,所以这个合约当然会导致反序列化异常。

我知道我可以独立于 WCF 合同对其进行序列化/反序列化,例如:

[OperationContract]
void SaveMyData(long id, string name, byte[] serializedData);

[OperationContract]
byte[] LoadMyData(long id, string name);

但这需要客户端上的额外代码来序列化和反序列化。我想避免这种情况并让客户端代码尽可能简单。

我知道我可以在客户端 dll中创建一个预构建代理,该代理将包装 WCF 调用并执行额外的序列化/反序列化。但我宁愿能够依赖从 WSDL 生成的客户端。

理想情况下,RawAttribute可以将 a 放在参数或返回值上,这将抑制(通用根object类型的)序列化/反序列化,而是从操作中提供或期望一个 (object)byte[] (或 (object)Stream?)。

[OperationBehavior]
public void SaveMyData(long id, string name, [Raw] object serializableData){ ... }

[OperationContract, Raw]
object LoadMyData(long id, string name);

我看过DataContractSurrogateDataContractResolver但我没有看到如何实现这一点。DataContractSurrogate在反序列化管道中似乎为时已晚,因为类型和反序列化对象已经提供。解析器不提供数据,只提供类型信息。两者都没有提供有关要为其反序列化的参数的信息RawAttribute

WCF 是否为此提供了适当的扩展点?还是内置方式?

我还想知道从序列化数据中提取的声明类型是什么,但这不是必需的。

谢谢!

4

1 回答 1

0

与其对抗 WCF 的序列化机制,您应该放弃一层抽象并在 WCF 的消息级别上工作。您正在寻找的是一种可以接受来自任何客户端的消息的“通用”服务。通读这篇关于 WCF 消息传递的旧但仍然适用的 MSDN 文章。本文的底部(图 8)是通用 WCF 服务的示例代码。这至少应该让您开始创建绕过序列化的服务。

于 2013-08-01T12:23:07.383 回答