Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Web services 在Silverlight 3中从WS-Response中删除XOP gunk_Web Services_Silverlight 3.0_Xop - Fatal编程技术网

Web services 在Silverlight 3中从WS-Response中删除XOP gunk

Web services 在Silverlight 3中从WS-Response中删除XOP gunk,web-services,silverlight-3.0,xop,Web Services,Silverlight 3.0,Xop,我有一个Silverlight客户端,需要调用web服务。web服务是用Java构建的,并使用XOP编码将二进制消息附加到它的一些调用中。但是,Silverlight服务只使用不包含任何二进制编码的调用。但是,由于我无法控制web服务,因此我仍然必须处理XOP多部分消息(下面是一个示例) 来自web服务的响应示例(数据剥离) HTTP/1.1200正常 服务器:ApacheCoote/1.1 X-Powered-By:Servlet 2.5;JBoss-5.0/JBossWeb-2.1 内容类型

我有一个Silverlight客户端,需要调用web服务。web服务是用Java构建的,并使用XOP编码将二进制消息附加到它的一些调用中。但是,Silverlight服务只使用不包含任何二进制编码的调用。但是,由于我无法控制web服务,因此我仍然必须处理XOP多部分消息(下面是一个示例)

来自web服务的响应示例(数据剥离)

HTTP/1.1200正常
服务器:ApacheCoote/1.1
X-Powered-By:Servlet 2.5;JBoss-5.0/JBossWeb-2.1
内容类型:多部分/相关;type=“应用程序/xop+xml”;边界=“uuid:890535d9-d11f-4dfb-8393-789e20ea8064”;start=“”;start info=“text/xml”
日期:2011年1月27日星期四格林威治标准时间22:03:09
内容长度:47247
--uuid:890535d9-d11f-4dfb-8393-789e20ea8064
内容类型:应用程序/xop+xml;字符集=UTF-8;type=“text/xml”;
内容传输编码:二进制
内容ID:
--uuid:890535d9-d11f-4dfb-8393-789e20ea8064--
我们当前的实现使用字符串替换手动构造soap消息,并使用WebClient类发布请求并将响应作为字符串下载。然后,我们不得不手动将数据解析为XML。这是可以的,但有点困难,而且我们有REST服务可供使用;我真的希望服务代理用对象来响应

我真正想做的是实现一个自定义行为,在WS-stack尝试反序列化SOAP并删除XOP gunk之前拦截消息,但到目前为止,我还没有发现任何允许我执行此类操作的方法

在我看来,我有几个选择:

  • 在服务器(由我控制)上创建一个代理服务,该服务将向Java服务重新提交请求,并且可以实际处理XOP。此选项具有我希望避免的性能影响

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

  • 保持原样


  • 有什么我没有看到的选择吗?

    没有,没有其他选择

    我决定实现一个pass-through ashx代理,它将使用WebClient.DownloadString()方法,然后只解析SOAP并将其插入响应中。它应该足够灵活,最重要的是,我可以使用Silverlight自动生成的代理类,然后让端点使用我的ashx代理,这使得维护更加简单

    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--