【发布时间】:2009-05-18 07:04:12
【问题描述】:
我们有我们的服务的 SOAP 实现,到目前为止,我们有一些遗留代码包装我们的 args 并返回另一个对象,以绕过 RPC 方法上的一些序列化/泛型。
经过优化,我们实现了这个类,使其Json序列化(DataContractJsonSerializer)并GZipped我们复杂的请求参数和响应对象。
我现在想将这些东西下推到 WCF 堆栈中。我真正想要的是在标准 SOAP 服务上将消息体编码为 GZipped Json 的能力。我们需要事务支持和安全等,因此我们需要能够支持标准绑定。
我已经设法实现 Json 序列化的操作行为,以便消息信息集将包含 json 兼容的 XML。然后我想添加一个 MessageEncoder 将 xml 转换为消息正文中的 json。这是我有问题的地方。我无法序列化整个消息,因为我们仍然有标准的肥皂头等,并且 s:body 在 json 兼容的 xml 之前仍然包含根请求或响应对象。我想我可以使用 JsonReaderWriterFactory 只是不确定如何应用于消息的正确部分。
我知道如果我能弄清楚读写这个 Json 部分,我以后可以做 GZIP。
有什么想法吗? 皮特
好的。所以澄清一下。
我的服务是这样的
[ServiceContract]
public interface IMyService {
[OperationContract]
Person SavePerson(Person personToSave);
[OperationContract]
Person GetPersons();
}
GetPersons() 方法的输出如下所示:
<s:Envelope xmlns:s="http://www.w3.org/2003/05/soap-envelope" xmlns:a="http://www.w3.org/2005/08/addressing">
<s:Header>
<a:Action s:mustUnderstand="1">http://www.petegoo.com/wcf/MyService/IMyService/GetPersonsResponse</a:Action>
<a:RelatesTo>urn:uuid:a18ccf1c-0793-4240-ba6f-9e86b6f2fdf6</a:RelatesTo>
</s:Header>
<s:Body>[{"DateOfBirth":"\/Date(286801200000+1300)\/","FirstName":"Foo","Id":1,"LastName":"Bar"},{"DateOfBirth":"\/Date(333720000000+1200)\/","FirstName":"Foo","Id":1,"LastName":"Bar"}]</s:Body>
</s:Envelope>
注意:以上内容是临时的,因此在语法或语义上可能不正确。
【问题讨论】:
-
您解决过这个问题吗?我正在开发一个项目,其中使用服务的客户端希望消息采用 JSON 格式,但内部要求需要(或强烈建议)SOAP。谢谢。