2016-09-01 5 views
0

私は奇妙なケースがあります。私はcontract-first approachを使ってWCF Webサービスを開発しています。物事は、XSDファイル内の特定の属性の順序をタグで定義しています。それでも、コントラクトファーストツールを使用して生成されたコードはこの順序を乱しているので、指定した属性の分布を持つxmlを送信しようとすると、SoapUIアプリケーションを使用してこのエラーが発生します:Contract-First XML属性(dis)order

要素 '' codigoProvinciaField '名前空間 'http://schemas.datacontract.org/2004/07/InventarioWS.ContractTypes'からは期待されていません。 「codigoCorporacionField」と「codigoProvinciaField」を入れ替えたときに動作します。「codigoCorporacionField」と「codigoProvinciaField」を入れ替えたときに動作します。私はそれらをxmlスキーマで逆に定義しています。

契約先のアプローチがなければ、[DataMember(Order = 0)] tagを使用することができます。

メッセージ:

'http://schemas.datacontract.org/2004/07/InventarioWS.ContractTypes'。 エレメンタリ 'codigoCorporacionField'。 エラー9は、ポジション42です。要素 '要素' 'codigoProvinciaField'は、要素を返します。 'http://schemas.datacontract.org/2004/07/InventarioWS.ContractTypes'です。 エレメンタリ 'codigoCorporacionField'。 System.Runtime.Serialization.XmlObjectSerializerReadContext.ThrowRequiredMemberMissingException(XmlReaderDelegator のXMLReader、のInt32 memberIndex、のInt32 requiredIndex、 XmlDictionaryString [] memberNames)EN EN System.Runtime.Serialization.XmlObjectSerializerReadContext.GetMemberIndexWithRequiredMembers(XmlReaderDelegator のXMLReader、XmlDictionaryString [] memberNames、XmlDictionaryString [] System.Runtime.Serialization.Cla EN ReadCodigoEnteFromXml(XmlReaderDelegator、 XmlObjectSerializerReadContext、XmlDictionaryString []、 XmlDictionaryString [])EN memberNamespaces、のInt32 memberIndex、のInt32 requiredIndex、 ExtensionDataObject extensionData) ssDataContract.ReadXmlValue System.Runtime.Serialization.XmlObjectSerializerReadContextエンSystem.Runtime.Serialization.XmlObjectSerializerReadContext.InternalDeserialize EN(XmlReaderDelegator のXMLReader、XmlObjectSerializerReadContextコンテキスト)(XmlReaderDelegator リーダ、文字列名、ストリングNS、タイプたdeclaredType、のDataContract & のDataContract) .InternalDeserialize(XmlReaderDelegator のXMLReader、のInt32のID、RuntimeTypeHandle declaredTypeHandle、ストリング 名、ストリングNS)ReadEnvioFromXml EN(XmlReaderDelegator、 XmlObjectSerializerReadContext、XmlDictionaryString []、 XmlDictionaryString []) System.Runtime.Serialization.ClassDataContract.ReadXmlValue EN System.Runtime.Serialization.XmlObjectSerializerReadContext.InternalDeserialize EN System.Runtime.Serialization.XmlObjectSerializerReadContext.InternalDeserialize(XmlReaderDelegator リーダ、文字列名、ストリングNS、タイプたdeclaredType、のDataContract & のDataContract)(EN(XmlReaderDelegator のXMLReader、XmlObjectSerializerReadContextコンテキスト) XmlReaderDelegator xmlReader、型宣言された型、DataContract dataContract、String name、 String ns)ja System.Runtime.Serialization.DataContractSerializer。InternalReadObject(XmlReaderDelegator のXMLReader、ブールverifyObjectName、DataContractResolver dataContractResolver) System.Runtime.Serialization.DataContractSerializer.ReadObject EN System.Runtime.Serialization.XmlObjectSerializer.ReadObjectHandleExceptions(XmlReaderDelegator リーダー、ブールverifyObjectName、DataContractResolver dataContractResolver)EN(XmlDictionaryReader System.ServiceModel.Dispatcher.DataContractSerializerOperationFormatter.DeserializeParameterPart EN System.ServiceModel.Dispatcher.DataContractSerializerOperationFormatter.PartInfo.ReadObject(XmlDictionaryReader リーダー、XmlObjectSerializerシリアライザ)(XmlDictionar ENリーダー、ブールverifyObjectName) yReader リーダー、PARTINFO部、ブールisRequest) System.Runtime.Serialization.SerializationExceptionエルformateador INICIO UNAexcepciónらintentar deserializarエルmensaje:EL parámetrohttp://tempuri.org/:envio deserializarエラーアルintentar。 El mensaje de InnerException era 'エラー9日目、42日目。' Element '' codigoProvinciaField 'の文字列が ' http://schemas.datacontract.org/2004/07/InventarioWS.ContractTypes 'です。 エレメンタリ 'codigoCorporacionField'。 'コンサルタント InnerExceptionパラメータは次のとおりです。

XSDファイル:

<?xml version="1.0" encoding="utf-8"?> 
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema"> 

    <xsd:element name="Envio"> 
    <xsd:complexType> 
     <xsd:sequence> 
     <xsd:element name="Version" type="xsd:string"> 
     </xsd:element> 
     <xsd:element ref="CodigoEnte" minOccurs="1" maxOccurs="1"/> 
     </xsd:sequence> 
    </xsd:complexType> 
    </xsd:element> 

    <xsd:element name="CodigoEnte"> 
    <xsd:complexType> 
     <xsd:sequence> 
     <xsd:element name="CodigoComunidad"> 
      <xsd:simpleType> 
      <xsd:restriction base="xsd:string"> 
       <xsd:length value="2"/> 
      </xsd:restriction> 
      </xsd:simpleType> 
     </xsd:element> 
     <xsd:element name="CodigoProvincia"> 
      <xsd:simpleType> 
      <xsd:restriction base="xsd:string"> 
       <xsd:length value="2"/> 
      </xsd:restriction> 
      </xsd:simpleType> 
     </xsd:element> 
     <xsd:element name="CodigoCorporacion"> 
      <xsd:simpleType> 
      <xsd:restriction base="xsd:string"> 
       <xsd:length value="3"/> 
      </xsd:restriction> 
      </xsd:simpleType> 
     </xsd:element> 
     <xsd:element name="Tiporg1"> 
      <xsd:simpleType> 
      <xsd:restriction base="xsd:string"> 
       <xsd:length value="1"/> 
      </xsd:restriction> 
      </xsd:simpleType> 
     </xsd:element> 
     <xsd:element name="Tiporg2"> 
      <xsd:simpleType> 
      <xsd:restriction base="xsd:string"> 
       <xsd:length value="1"/> 
      </xsd:restriction> 
      </xsd:simpleType> 
     </xsd:element> 
     <xsd:element name="Tiporg3"> 
      <xsd:simpleType> 
      <xsd:restriction base="xsd:string"> 
       <xsd:length value="3"/> 
      </xsd:restriction> 
      </xsd:simpleType> 
     </xsd:element> 
     </xsd:sequence> 
    </xsd:complexType> 
    </xsd:element> 

</xsd:schema> 

そしてSOAPUIを使用して送信されたXML:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:tem="http://tempuri.org/" xmlns:inv="http://schemas.datacontract.org/2004/07/InventarioWS.ContractTypes"> 
    <soapenv:Header/> 
    <soapenv:Body> 
     <tem:RecuperaCorporacionXCodigo> 
     <!--Optional:--> 
     <tem:envio> 
      <inv:codigoEnteField> 
       <inv:codigoComunidadField>12</inv:codigoComunidadField> 
       <inv:codigoProvinciaField>28</inv:codigoProvinciaField> 
       <inv:codigoCorporacionField>022</inv:codigoCorporacionField> 
       <inv:tiporg1Field>A</inv:tiporg1Field> 
       <inv:tiporg2Field>A</inv:tiporg2Field> 
       <inv:tiporg3Field>000</inv:tiporg3Field> 
      </inv:codigoEnteField> 
      <inv:versionField>?</inv:versionField> 
     </tem:envio> 
     </tem:RecuperaCorporacionXCodigo> 
    </soapenv:Body> 
</soapenv:Envelope> 

編集:私は、エラーがフレームワークによって与えられたunsolicicited alfabetical順から来ていると言うのを忘れて/ツール。このanswerさんの言葉:

このようにOrderプロパティを指定すると、RegionIDが生成されたスキーマのRegionDescriptionの前に来るようになります。このプロパティがないと、スキーマのシーケンスはアルファベット順にソートされます。 Visual Studioは正しいプロキシを生成しますが、自分のクラスがどのように見えるか分かりません。クライアント側が同じOrderプロパティを指定していることを確認してください。

+0

codigoEnteFieldの後にversionFieldをXMLファイルに挿入するのはなぜですか? XSD回路図には、codigoEnteFieldの前に配置する必要があります。 –

+0

あなたが正しいです、私はその順序を変更しましたが、以前のエラーには影響しません。 – mantoviejo

+0

少し話題ですが、要素名に数字を使用しないでください。法的なXMLですが、それを消費する人にとってはひどいものです。ほとんどのXML開発者は、// inv:tiporgではなく// inv:tiporg1、// inv:tiporg2、// inv:tiporg3などのすべてのtiporgフィールドを取得できると期待します。 –

答えて

1

なぜ問題が現れているのか説明できませんが、回避策があると思います。
XSDの<xsd:sequence><xs:all>に置き換えてください。 <all>インジケータは、子要素が任意の順序で出現できること、および各子要素が1回だけ出現することを指定します。これはあなたの問題を解決するはずです。

+0

私は試しましたが、問題は解決しません。また、xs:allはエラーを修正するだけでなく、属性の混乱を防ぎ、顧客の要件です。それは素晴らしい試みだった。 – mantoviejo

+0

ディエゴが正しいです。注文はXMLでは重要ではなく、ドキュメントの階層(何が何を含むか)だけが重要です。 –

+0

私は同意しません。問題がなければ、どうしてこのエラーが出るのですか?内部XMLマッピングは、System.Runtime.Serialization.XmlObjectSerializerReadContext.ThrowRequiredMemberMissingExceptionについて不平を言っています。また、xs:sequenceを使用すると、xs:allタグではなく、定義した順序と同じ順序が必要になります。だから私はディエゴの答えにはポイントがあると思うのです。 – mantoviejo

0

問題のある属性の名前を "param1 ..."というプレフィックスに変更して回避策を講じました。私はこれを将来の参考文献のために書いていますが、実際の修正が必要です。