WCF禁止某些操作实现参数的反序列化

时间:2013-07-31 14:02:39

标签: wcf serialization wsdl

我有一个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可以放在参数或返回值上,这将抑制序列化/反序列化(通用根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是否为此提供了适当的扩展点?还是内置的方式?

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

谢谢!

1 个答案:

答案 0 :(得分:0)

相反,为了对抗WCF的序列化机制,您应该删除一个抽象级别并在WCF的消息级别工作。您正在寻找的是一种“通用”服务,可以接受来自任何客户的消息。仔细阅读这个陈旧但仍然适用的MSDN article on WCF Messaging。在文章的底部(图8)是通用WCF服务的示例代码。这应该至少可以帮助您开始创建绕过序列化的服务。