我有一个 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);
我看过DataContractSurrogate
,DataContractResolver
但我没有看到如何实现这一点。DataContractSurrogate
在反序列化管道中似乎为时已晚,因为类型和反序列化对象已经提供。解析器不提供数据,只提供类型信息。两者都没有提供有关要为其反序列化的参数的信息RawAttribute
。
WCF 是否为此提供了适当的扩展点?还是内置方式?
我还想知道从序列化数据中提取的声明类型是什么,但这不是必需的。
谢谢!