2012-05-11 56 views
1

我正在使用WCF .Net 4.0調用用Java編寫的Web服務。部分WSDL引用了SPML 2.0,我附加了一些代碼來描述發生的事情。WCF 4.0無法從Java Web Service反序列化SOAP

的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.AnyXmlElement數據類型。

任何建議有什麼不對?

+0

我改爲使用Web引用,它現在工作正常,引擎蓋下有什麼區別? – hardywang

+1

有沒有故意的區別,只是不同的錯誤... –

回答

0

我剛剛遇到同樣的問題。看起來問題與public System.Xml.XmlElement[] Any屬性的組合XmlAnyElementAttribute屬性與Order限定符集合有關。也可能是它僅在從XmlElement[] Any陣列繼承基類時發生。

在我的情況的解決方案是刪除訂單預選賽中XmlElementAttribute attibutes,XmlAnyElementAttribute屬性和屬性MessageBodyMemberAttribute所有繼承類

注:粗斜體這一點是很重要的,否則你會得到一個錯誤這樣的:

類型成員「XYZ」,在「ABC_Type」宣佈缺少必需的「秩序」 財產。如果在類層次結構中的類使用顯式 排序功能(訂單),那麼它的基類和所有派生類 必須做同樣的

我沒有做過的研究,以檢查什麼可能的副作用是從這一點 - 重要的一件事是在您的課堂中按照正確的順序讓您的屬性順序化,以便序列化以正確的順序進行。

希望這有助於某人。