我们有我们服务的SOAP实现,到目前为止,我们有一些遗留代码包装我们的args并返回另一个对象来绕过RPC方法的一些序列化/泛型。
在优化之后,我们已经实现了这个类,以便Json序列化(DataContractJsonSerializer)并GZip我们复杂的请求参数和响应对象。
我现在想把这些东西推到WCF堆栈中。我真正想要的是能够在标准SOAP服务上将消息体编码为GZipped Json。我们需要事务支持和安全性等,因此我们需要能够支持标准绑定。
我已经设法实现了对Json序列化的操作行为,以便消息信息集将包含json兼容的XML。然后我想添加一个MessageEncoder来将xml转换为消息体中的json。这是我遇到问题的地方。我无法序列化整个消息,因为我们仍然有标准的soap标头等,而s:body在json兼容的xml之前仍然包含一个根Request或Response对象。我想我可以使用JsonReaderWriterFactory,但不确定如何应用于消息的correc部分。
我知道如果我能读出并写出这个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>
注意:以上是临时的,因此可能在语法或语义上不正确。
答案 0 :(得分:0)
我的理解是你喜欢将JSON嵌入到SOAP中的XML信息集中吗? 编写一些您想要实现的样本请求和响应会更容易。
我认为没有充分的理由将JSON信息集与XML信息集共存。但是,您可以将JSON数据作为SOAP中的XML元素/属性的字符串值返回。
答案 1 :(得分:0)
稀释!!想知道这有多大。如果它适用于任何其他人,将留在这里。
我自己对这一切都很陌生,但作为一个建议,您是否尝试过调查MessageInspectors
?您可以将这些内容添加到clientRuntime
和dispatchRuntime
,以便在WCF发送之前和之后使用SOAP消息“播放”。
通过实施IDispatchMessageInspector
和/或IClientMessageInspector
,您可以在发送邮件之前接听电话,阅读当前的肥皂消息xml,更改body元素的内容以包含您的压缩内容(也许将其添加为新的子节点)然后重新构建消息并将其传递回WCF以发送出去。在接收端,您再次在AfterReceiveRequest
中抓取消息并反转该过程。
不知道这是否适合您,但希望它有所帮助。 w ^