我有一个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);
我看过DataContractSurrogate
和DataContractResolver
,但我没看到如何实现这一目标。 DataContractSurrogate
在反序列化管道中似乎为时已晚,因为已经提供了类型和反序列化对象。解析器不提供数据,只提供类型信息。两者都没有提供有关要反序列化的参数的信息,以便找到RawAttribute
。
WCF是否为此提供了适当的扩展点?还是内置的方式?
我还想知道从序列化数据中提取的声明类型是什么,但这不是必需的。
谢谢!
答案 0 :(得分:0)
相反,为了对抗WCF的序列化机制,您应该删除一个抽象级别并在WCF的消息级别工作。您正在寻找的是一种“通用”服务,可以接受来自任何客户的消息。仔细阅读这个陈旧但仍然适用的MSDN article on WCF Messaging。在文章的底部(图8)是通用WCF服务的示例代码。这应该至少可以帮助您开始创建绕过序列化的服务。