首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法解析MTOM响应

无法解析MTOM响应
EN

Stack Overflow用户
提问于 2013-06-26 20:29:57
回答 1查看 2.3K关注 0票数 1

我正在利用一个第三方web服务,它返回一个使用MTOM编码附加了PDF的对象。

该对象被构造为具有字段ContentTypeInclude的每个数组元素的Data[]

当我运行web服务方法时,它可以很好地完成请求,但是它不能正确地解析响应,因为Include字段被解析为null

当我运行Fiddler时,我实际上可以看到远程web服务返回一个包含所有可用字段的响应。

这是在SOAP中发送的内容:

代码语言:javascript
复制
<m:GetDocImageResponse>
    <x:data>
        <x:item xmime5:contentType="*/*">
        <xop:Include href="cid:id1"/></x:item>
    </x:data>
</m:GetDocImageResponse>

我看到Include有一个名为href的属性,其中包含一个对二进制PDF文档的引用。

我正在尝试根据WSDL解析对象:

代码语言:javascript
复制
Data[] retObject = null;
using (blahWS ws = new blahWS())
{
 try{
retObject = ws.GetDoc(parameters); //request completes with no errors, but `Include` is parse as null
[...]
   }
catch
{..}
 }

web服务引用与简单的basicHttpBinding一起使用

代码语言:javascript
复制
<basicHttpBinding>
    <binding name="BasicHTTPwithMTOM" messageEncoding="Mtom" maxBufferSize="2147483647" maxReceivedMessageSize="2147483647" textEncoding="utf-8" />        
</basicHttpBinding>

我应该以不同的方式解析响应吗?为什么它不解析这些字段?

编辑:

完整SOAP响应:

代码语言:javascript
复制
HTTP/1.1 200 OK
Server: gSOAP/2.7
Content-Type: multipart/related; charset=utf-8; boundary="==nGpzR/KspN6ry7jG8CU4bonN2aujzfJamyN3xYjaldFXYpeUryNGb0UROC0B=="; type="application/xop+xml"; start="<SOAP-ENV:Envelope>"; start-info="text/xml"
Content-Length: 180557
Connection: close

--==nGpzR/KspN6ry7jG8CU4bonN2aujzfJamyN3xYjaldFXYpeUryNGb0UROC0B==
Content-Type: application/xop+xml; charset=utf-8; type="text/xml"
Content-Transfer-Encoding: binary
Content-ID: <SOAP-ENV:Envelope>

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xop="http://www.w3.org/2004/08/xop/include" xmlns:xmime5="http://www.w3.org/2005/05/xmlmime" xmlns:m="http://www.mcleodsoftware.com/wsdl/ws4v.wsdl" xmlns:x="http://www.mcleodsoftware.com/schemas/ws4v.xsd">
<SOAP-ENV:Body>
    <m:GetDocImageResponse>
        <x:data>
            <x:item xmime5:contentType="*/*">
                <xop:Include href="cid:id1"/></x:item>
        </x:data>
    </m:GetDocImageResponse>
</SOAP-ENV:Body>

代码语言:javascript
复制
--==nGpzR/KspN6ry7jG8CU4bonN2aujzfJamyN3xYjaldFXYpeUryNGb0UROC0B==
Content-Type: */*
Content-Transfer-Encoding: binary
Content-ID: <id1>
...binary...

使用提供的WSDL构建的数据定义:

代码语言:javascript
复制
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.233")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="http://www.mcleodsoftware.com/schemas/ws4v.xsd")]
public partial class Data : object, System.ComponentModel.INotifyPropertyChanged {

    private Include includeField;

    private string contentTypeField;

    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute(Namespace="http://www.w3.org/2004/08/xop/include", Order=0)]
    public Include Include {
        get {
            return this.includeField;
        }
        set {
            this.includeField = value;
            this.RaisePropertyChanged("Include");
        }
    }
EN

回答 1

Stack Overflow用户

发布于 2013-07-26 14:06:18

看起来您的WSDL显式地提供了元素的模式。我非常确定这是错误的,也不符合标准。元素应该被声明为简单的xsd:base64Binary类型(例如,参见http://www.w3.org/Submission/WS-MTOMPolicy/ ),还有其他符合标准的方式在您的WSDL中声明您正在使用MTOM (例如,参见base64Binary)

如果您将WSDL修复为符合标准(或者至少符合WCF期望的"MTOM WSDL“的样子),我认为一切都应该正常工作。实际上,如果你想看看一个合适的"MTOM WSDL“是什么样子的,只需要创建一个简单的MTOM服务代码--首先用WCF --例如http://msdn.microsoft.com/en-us/library/aa395209.aspx --然后看看它产生的WSDL和XSD。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17320042

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档