WCF 4.0无法从Java Web服务反序列化SOAP

时间:2012-05-11 18:54:42

标签: wcf

我正在使用WCF .Net 4.0来调用用Java编写的Web服务。 WSDL的一部分引用了SPML 2.0,我附上了一些代码来描述发生了什么。

WSDL引用了一些XSD,我正在使用的部分是

<?xml version="1.0" encoding="utf-8"?>
<xsd:schema xmlns:spml="urn:oasis:names:tc:SPML:2:0" xmlns:sec="urn:corp:iam:spml2:security" xmlns="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" targetNamespace="urn:corp:iam:spml2:security" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <xsd:import schemaLocation="../oasis-spml-xsds/pstc_spmlv2_core.xsd" namespace="urn:oasis:names:tc:SPML:2:0" />
  <xsd:complexType name="SuggestUserIDResponseType">
    <xsd:complexContent mixed="false">
      <xsd:extension base="spml:ResponseType">
        <xsd:sequence>
          <xsd:element minOccurs="1" maxOccurs="5" name="uid" type="xsd:string" />
        </xsd:sequence>
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
</xsd:schema>

<?xml version="1.0" encoding="utf-8"?>
<xsd:schema xmlns:spml="urn:oasis:names:tc:SPML:2:0" xmlns="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified" targetNamespace="urn:oasis:names:tc:SPML:2:0" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
  <xsd:complexType name="ExtensibleType">
    <xsd:sequence>
      <xsd:any minOccurs="0" maxOccurs="unbounded" namespace="##other" processContents="lax" />
    </xsd:sequence>
    <xsd:anyAttribute namespace="##other" processContents="lax" />
  </xsd:complexType>
  <xsd:complexType name="ResponseType">
    <xsd:complexContent mixed="false">
      <xsd:extension base="spml:ExtensibleType">
        <xsd:sequence>
          <xsd:element minOccurs="0" maxOccurs="unbounded" name="errorMessage" type="xsd:string" />
        </xsd:sequence>
        <xsd:attribute name="status" type="spml:StatusCodeType" use="required" />
        <xsd:attribute name="requestID" type="xsd:ID" use="optional" />
        <xsd:attribute name="error" type="spml:ErrorCode" use="optional" />
      </xsd:extension>
    </xsd:complexContent>
  </xsd:complexType>
</xsd:schema>

因此WCF服务引用生成的代理类是

[System.Xml.Serialization.XmlIncludeAttribute(typeof(SchemaType1))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(ObjectClassDefinitionType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(ObjectClassDefinitionReferencesType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(ObjectClassDefinitionReferenceType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(AttributeDefinitionReferencesType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(AttributeDefinitionReferenceType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(AttributeDefinitionType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(CapabilityType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(CapabilitiesListType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(SchemaEntityRefType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(SchemaType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(TargetType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(PSOType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(ResponseType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(ActiveResponseType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(SearchResponseType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(ValidatePasswordResponseType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(ResetPasswordResponseType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(BatchResponseType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(ListTargetsResponseType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(LookupResponseType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(ModifyResponseType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(AddResponseType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(AuthenticateUserResponseType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(SuggestUserIDResponseType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(ResultsIteratorType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(SearchQueryType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(NamespacePrefixMappingType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(QueryClauseType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(IsActiveType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(LogicalOperatorType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(SelectionType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(ModificationType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(IdentifierType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(PSOIdentifierType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(RequestType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(ActiveRequestType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(ResumeRequestType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(SuspendRequestType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(CloseIteratorRequestType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(IterateRequestType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(SearchRequestType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(ValidatePasswordRequestType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(ResetPasswordRequestType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(ExpirePasswordRequestType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(SetPasswordRequestType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(BatchRequestType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(ListTargetsRequestType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(LookupRequestType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(DeleteRequestType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(ModifyRequestType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(AddRequestType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(AuthenticateUserRequestType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(SuggestUserIDRequestType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(VerifySecurityAnswerRequestType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(CapabilityDataType))]
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.225")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="urn:oasis:names:tc:SPML:2:0")]
public partial class ExtensibleType : object, System.ComponentModel.INotifyPropertyChanged {

    private System.Xml.XmlElement[] anyField;

    private System.Xml.XmlAttribute[] anyAttrField;

    /// <remarks/>
    [System.Xml.Serialization.XmlAnyElementAttribute(Order=0)]
    public System.Xml.XmlElement[] Any {
        get {
            return this.anyField;
        }
        set {
            this.anyField = value;
            this.RaisePropertyChanged("Any");
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlAnyAttributeAttribute()]
    public System.Xml.XmlAttribute[] AnyAttr {
        get {
            return this.anyAttrField;
        }
        set {
            this.anyAttrField = value;
            this.RaisePropertyChanged("AnyAttr");
        }
    }

    public event System.ComponentModel.PropertyChangedEventHandler PropertyChanged;

    protected void RaisePropertyChanged(string propertyName) {
        System.ComponentModel.PropertyChangedEventHandler propertyChanged = this.PropertyChanged;
        if ((propertyChanged != null)) {
            propertyChanged(this, new System.ComponentModel.PropertyChangedEventArgs(propertyName));
        }
    }
}

[System.Xml.Serialization.XmlIncludeAttribute(typeof(ActiveResponseType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(SearchResponseType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(ValidatePasswordResponseType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(ResetPasswordResponseType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(BatchResponseType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(ListTargetsResponseType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(LookupResponseType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(ModifyResponseType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(AddResponseType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(AuthenticateUserResponseType))]
[System.Xml.Serialization.XmlIncludeAttribute(typeof(SuggestUserIDResponseType))]
[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.225")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="urn:oasis:names:tc:SPML:2:0")]
public partial class ResponseType : ExtensibleType {

    private string[] errorMessageField;

    private StatusCodeType statusField;

    private string requestIDField;

    private ErrorCode errorField;

    private bool errorFieldSpecified;

    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute("errorMessage", Order=0)]
    public string[] errorMessage {
        get {
            return this.errorMessageField;
        }
        set {
            this.errorMessageField = value;
            this.RaisePropertyChanged("errorMessage");
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public StatusCodeType status {
        get {
            return this.statusField;
        }
        set {
            this.statusField = value;
            this.RaisePropertyChanged("status");
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute(DataType="ID")]
    public string requestID {
        get {
            return this.requestIDField;
        }
        set {
            this.requestIDField = value;
            this.RaisePropertyChanged("requestID");
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlAttributeAttribute()]
    public ErrorCode error {
        get {
            return this.errorField;
        }
        set {
            this.errorField = value;
            this.RaisePropertyChanged("error");
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlIgnoreAttribute()]
    public bool errorSpecified {
        get {
            return this.errorFieldSpecified;
        }
        set {
            this.errorFieldSpecified = value;
            this.RaisePropertyChanged("errorSpecified");
        }
    }
}

[System.CodeDom.Compiler.GeneratedCodeAttribute("System.Xml", "4.0.30319.225")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="urn:corp:iam:spml2:security")]
public partial class SuggestUserIDResponseType : ResponseType {

    private string[] uidField;

    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute("uid", Order=0)]
    public string[] uid {
        get {
            return this.uidField;
        }
        set {
            this.uidField = value;
            this.RaisePropertyChanged("uid");
        }
    }
}

在其中一个服务调用中,返回的SOAP消息是

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
   <soap:Body>
      <ns3:suggestUserIDResponse status="success" requestID="MyApp" xmlns="urn:oasis:names:tc:SPML:2:0" xmlns:ns2="urn:oasis:names:tc:SPML:2:0:password" xmlns:ns3="urn:corp:iam:spml2:security" xmlns:ns4="urn:oasis:names:tc:SPML:2:0:suspend" xmlns:ns5="urn:oasis:names:tc:SPML:2:0:search" xmlns:ns6="urn:oasis:names:tc:SPML:2:0:DSML" xmlns:ns7="urn:oasis:names:tc:DSML:2:0:core" xmlns:ns8="urn:oasis:names:tc:SPML:2:0:batch">
         <ns3:uid>text1</ns3:uid>
         <ns3:uid>text2</ns3:uid>
         <ns3:uid>text3</ns3:uid>
      </ns3:suggestUserIDResponse>
   </soap:Body>
</soap:Envelope>

此时,SOAP未正确反序列化为SuggestUserIDResponseType类,SuggestUserIDResponseType.uid始终为空,但重复的uid仅在SuggestUserIDResponseType.Any中显示为XmlElement数据类型。

有什么建议吗?

1 个答案:

答案 0 :(得分:0)

我刚遇到同样的问题。看起来问题与使用public System.Xml.XmlElement[] Any属性修饰的XmlAnyElementAttribute属性和Order限定符集的组合有关。也可能只有在从具有XmlElement[] Any数组的基类继承时才会发生。

我的解决方案是删除所有继承类中的XmlElementAttribute属性,XmlAnyElementAttribute属性和MessageBodyMemberAttribute属性 中的订单限定符 < /强>

注意:粗体斜体中的那个位很重要,否则您会收到如下错误:

  

键入成员&#34; XYZ&#34;声明在&#34; ABC_Type&#34;缺少必需的订单&#39;   属性。如果类层次结构中的一个类使用显式   排序功能(Order),然后是它的基类和所有派生的   课程必须做同样的事情

我还没有完成这项研究以检查可能出现的副作用 - 有一点很重要,可能是你的属性在你的班级中按照正确的顺序排列,以便序列化以正确的顺序发生。 / p>

希望这有助于某人。