Visual Studio에서 웹 서비스 프록시를 생성하는 데 사용하는 도구 인 wsdl.exe에 알려진 버그가있는 것 같습니다. 특정 XSD 스키마의 경우이 도구는 XML에서 직렬화 할 수없는 클래스를 생성합니다.Visual Studio에서 들쭉날쭉 한 배열을 처리하기 위해 생성 한 웹 참조 프록시를 어떻게 수정합니까?
필자는 그것이 받아 들일 수 없다고 우려하고 있지만 어떻게 수정해야할지 모르겠다.
세부 사항을 설명하고 누군가가 나를 도와 줄 수 있기를 바랍니다. 일반적인 응답이 스키마에 따라 웹 서비스
에서
스키마
<!-- 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 응답은 다음과 같습니다
<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>
코드의 형식을 사용하여
나는이 같은 CLR 유형을 사용할 수있을 것으로 예상했을 것이다:
result.assets[0].attributes[0].name
대신, 결과에 대해 생성 된 유형은 다음과 같습니다
[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; }
}
}
도하지 않는 직렬화 어셈블리가 생성되도록 허용하십시오! Portfolio.WebService.multiValuedAttribute에 유형 에게 []
가 수정을 Portfolio.WebService.multiValuedAttribute 변환 할
수 없습니다 그것을
1 - 프로퍼티 및 필드
의 유형 변경이제 온라인에서 찾은 수정 중 하나는 gen의 유형에서 한 쌍의 대괄호를 제거하는 것입니다 erated 특성 : 직렬화 어셈블리를 구축 할 수 있습니다, 그것은 제대로 데이터를 직렬화하지 않습니다를 제외하고는 자산의 목록을 '생략'과 제의 특성을 역 직렬화 예외없이 실행
// No longer a jagged array, but this doesn't deserialize all data public multiValuedAttribute[] assets;
assets
요소. 따라서이 픽스를 사용하면 데이터를 소비 할 수 없으므로 전혀 문제가되지 않습니다. 700 개 이상의 애셋의 경우result.assets
은multiValuedAttribute[2]
과 같습니다 (두 요소는 첫 번째 애셋의 이름 및 키워드 속성 임). -2 XML 요소
내가 시도 두 번째 것은 디시리얼라이저 다른 지침을 제공하는 것입니다의 유형 지정 : 그래서
[XmlArrayItemAttribute("attributes", typeof(multiValuedAttribute[]), Form=XmlSchemaForm.Unqualified)] public multiValuedAttribute[][] assets { ... }
지금은 그것을 말하고를 그 각 요소 시퀀스는
multiValuedAttribute[]
입니다.이는attributes
요소를 여전히보고 있으므로multiValuedAttribute
유형 (배열이 아닌 단일 형식)이기 때문에 잘못되었습니다. 그러나 지금은result.assets
이multiValuedAttribute[2][0]
과 같으며 여전히 데이터를 가져올 수 없습니다.다음은?
나는 이것을 작성한 이유가 없습니다. .NET은이 웹 서비스를 사용할 수 없기 때문에 .NET이이를 수용 할 수 없습니다.
혹시 더 나은 솔루션을 찾으러 왔습니까? 정확한 문제에 직면하고 있지만 수정할 필요가있는 수백 가지 유형이 있습니다. –