Es scheint, dass es einen bekannten Fehler in wsdl.exe gibt, dem Tool, das Visual Studio verwendet, um Web-Service-Proxies zu generieren. Bei bestimmten XSD-Schemas generiert das Tool Klassen, die nicht aus dem XML-Code deserialisiert werden können.Wie kann ich den Web-Referenz-Proxy reparieren, den Visual Studio zur Verarbeitung von gezackten Arrays generiert hat?
Soweit es mich betrifft, das ist inakzeptabel, aber ich weiß nicht, wie man es beheben kann.
Ich werde meinen Fall im Detail beschreiben, hoffentlich wird mir jemand dabei helfen können.
Schema
<!-- return type from the service operation -->
<xs:complexType name="listAssetsQueryResults">
<xs:sequence>
<xs:element name="assets" type="tns:asset" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<!-- a sequence of attributes -->
<xs:complexType name="asset">
<xs:sequence>
<xs:element name="attributes" type="tns:multiValuedAttribute" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
<xs:complexType name="multiValuedAttribute">
<!-- not relevant-->
</xs:complexType>
XML-Antwort von der WebService
Eine typische Reaktion auf dieses Schema entsprechend sieht wie folgt aus:
<assets-query-result>
<assets>
<attributes>
<name>Keywords</name>
<values>Desert</values>
</attributes>
<attributes>
<name>Filename</name>
<values>Desert.jpg</values>
</attributes>
</assets>
<assets>...</assets>
<assets>...</assets>
</assets-query-result>
die Typen im Code verwenden
ich hätte anknüpfen können die CLR-Typen wie folgt verwenden:
result.assets[0].attributes[0].name
Stattdessen sieht der erzeugte Typ für das Ergebnis wie folgt aus:
[SerializableAttribute()]
public partial class listAssetsQueryResults {
private multiValuedAttribute[][] assetsField;
[XmlArrayAttribute(Form=XmlSchemaForm.Unqualified, IsNullable=true)]
[XmlArrayItemAttribute("attributes", typeof(multiValuedAttribute), Form=XmlSchemaForm.Unqualified)]
public multiValuedAttribute[][] assets {
get { return this.assetsField; }
set { this.assetsField = value; }
}
}
die nicht einmal tut erlauben Sie, dass die Serialisierungsassembly erzeugt wird!
Unable Typ konvertieren Portfolio.WebService.multiValuedAttribute zu Portfolio.WebService.multiValuedAttribute []
Fixing es
1 - Ändern der Art der Immobilie und Feld
Eine der Korrekturen, die ich online gefunden habe, ist einfach, ein Paar Klammern vom Typ des Gen zu entfernen erated Eigenschaft:
// No longer a jagged array, but this doesn't deserialize all data
public multiValuedAttribute[] assets;
Das ist die Serialisierungsassembly gebaut werden können, und es läuft ohne Ausnahmen, außer es die Daten nicht richtig serialisiert, es springt "die Liste der Vermögenswerte und deserialisiert die Attribute des ersten assets
Element. Es ist also überhaupt keine Lösung, denn mit dieser Lösung kann ich die Daten nicht konsumieren. Für 700+ Assets gibt es result.assets
ist gleich multiValuedAttribute[2]
(die 2 Elemente sind die Attribute name und keywords des ersten Assets).
2 - Angabe der Art der XML-Elemente
Das zweite, was ich versuchte, ist die Deserializer verschiedene Anweisungen zu geben:
[XmlArrayItemAttribute("attributes", typeof(multiValuedAttribute[]), Form=XmlSchemaForm.Unqualified)]
public multiValuedAttribute[][] assets { ... }
So, jetzt sage ich es, dass jedes Element in der Sequenz ist vom Typ multiValuedAttribute[]
.Das ist falsch, weil es immer noch attributes
Elemente betrachtet, die vom Typ multiValuedAttribute
(single, kein Array) sind. Es läuft aber, aber jetzt ist die result.assets
gleich multiValuedAttribute[2][0]
und ich bin immer noch nicht in der Lage, zu den Daten zu gelangen.
Was kommt als nächstes?
Ich habe keine Ahnung, weshalb ich das geschrieben habe. Ich kann nicht akzeptieren, dass .NET diesen Webdienst nicht nutzen kann, weil er es muss.
Haben Sie jemals eine bessere Lösung dafür gefunden? Ich bin mit dem genauen Problem konfrontiert, aber ich habe Hunderte von Typen, die geändert werden müssten –