我有一个 Silverlight 客户端,我需要调用一个 Web 服务。Web 服务是用 Java 构建的,并使用 XOP 编码将二进制消息附加到它的某些调用中。但是,Silverlight 服务仅使用不包含任何二进制编码的调用。但是,由于我无法控制 Web 服务,我仍然必须处理 XOP 多部分消息 - (下面是一个示例)。
来自 Web 服务的示例响应(数据剥离)
HTTP/1.1 200 OK
Server: Apache-Coyote/1.1
X-Powered-By: Servlet 2.5; JBoss-5.0/JBossWeb-2.1
Content-Type: multipart/related; type="application/xop+xml"; boundary="uuid:890535d9-d11f-4dfb-8393-789e20ea8064"; start="<root.message@cxf.apache.org>"; start-info="text/xml"
Date: Thu, 27 Jan 2011 22:03:09 GMT
Content-Length: 47247
--uuid:890535d9-d11f-4dfb-8393-789e20ea8064
Content-Type: application/xop+xml; charset=UTF-8; type="text/xml";
Content-Transfer-Encoding: binary
Content-ID: <root.message@cxf.apache.org>
<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
<soap:Body>
<ns2:Response xmlns:ns2="http://tempuri.com/"></ns2:Response>
</soap:Body>
</soap:Envelope>
--uuid:890535d9-d11f-4dfb-8393-789e20ea8064--
我们当前的实现使用字符串替换手动构造了一个肥皂消息,并使用 WebClient 类来发布请求并将响应下载为字符串。然后,我们不得不手动将数据解析为 XML。这没关系,但有点困难,无论如何我们都有可用的 REST 服务;我真的很希望服务代理能够响应对象。
我真正想做的是实现一个自定义行为,该行为将在 WS 堆栈尝试反序列化 SOAP 并删除 XOP gunk 之前拦截消息,但到目前为止,我还没有发现任何东西可以让我做这样的事情。
在我看来,我有几个选择:
在服务器(由我控制)上创建一个代理服务,该服务将向 Java 服务重新提交请求并实际处理 XOP。此选项具有我想避免的性能影响。
实现将处理 XOP 的自定义 MessageEncodingBindingElement、MessageEncoderFactory 和 MessageEncoder。这个选项一开始似乎是最好的,但由于我无法扩展 TextMessageEncoderFactory 或 TextMessageEncoder(它们是内部类),我基本上需要从头开始重写整个消息编码(非常感谢 Microsoft!)。
让事情保持原样。
有没有我没有看到的选项?