我有一个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--

我们当前的实现使用字符串替换手动构建SOAP消息,并使用WebClient类来发布请求并下载响应作为字符串。然后,我们将数据手动解析为XML。这还可以,但是这有点困难,无论如何我们都可以使用休息服务。我真的很希望服务代理能够用对象做出响应。

我真正想做的是实现一种自定义行为,该行为将在WS堆栈试图拆卸肥皂并删除XOP gunk之前拦截消息,但是到目前为止,我没有找到任何可以让我做这样的事情。

我看到它的方式,我有一些选择:

  1. 在服务器上创建代理服务(我控制的),该服务将将请求重新提交为Java服务,并可以实际处理XOP。这个选项具有我想避免的性能含义。

  2. 实现将处理XOP的自定义MessageEncodingBindingElement,MessageEncoderFactory和MessageEncoder。此选项一开始似乎是最好的,但是由于我无法扩展TextMessageEncoderFactory或TextMessageEncoder(它们是内部类),因此我基本上需要重写Scratch编码的整个消息(非常感谢Microsoft!)。

  3. 留下东西。

我没有看到任何选择吗?

有帮助吗?

解决方案

不,没有其他选择。

我决定实现一个通行ASHX代理,该代理将使用WebClient.downloadstring()方法,然后将肥皂插入并插入响应中。它应该足够灵活,最重要的是,我可以使用Silverlight的自动化代理类,然后使端点使用我的ASHX代理 - 这使维护变得更加简单。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top