私は奇妙なケースがあります。私は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プロパティを指定していることを確認してください。
codigoEnteFieldの後にversionFieldをXMLファイルに挿入するのはなぜですか? XSD回路図には、codigoEnteFieldの前に配置する必要があります。 –
あなたが正しいです、私はその順序を変更しましたが、以前のエラーには影響しません。 – mantoviejo
少し話題ですが、要素名に数字を使用しないでください。法的なXMLですが、それを消費する人にとってはひどいものです。ほとんどのXML開発者は、// inv:tiporgではなく// inv:tiporg1、// inv:tiporg2、// inv:tiporg3などのすべてのtiporgフィールドを取得できると期待します。 –