Ошибка создания правильных прокси-объектов из WSDL - PullRequest
3 голосов
/ 17 марта 2010

У меня проблема с генератором WSDL в .NET. Он пропускает сложные типы в одном конкретном методе.

Ответ от веб-службы

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:tns="http://www.x.com/2.6.0">
<SOAP-ENV:Body>
 <ns1:Export.GetData xmlns:ns1="http://www.x.com/">
  <return xsi:type="tns:data_warehouse_report">
   <start_row xsi:type="xsd:int">1</start_row>
   <end_row xsi:type="xsd:int">2</end_row>
   <finished xsi:type="xsd:boolean">true</finished>
   <rows xsi:type="SOAP-ENC:Array" SOAP-ENC:arrayType="tns:data_warehouse_report_row[2]">
    <item xsi:type="SOAP-ENC:Array" SOAP-ENC:arrayType="xsd:string[3]">
     <item xsi:type="xsd:string">March 12, 2010</item>
     <item xsi:type="xsd:string">recipient3</item>
     <item xsi:type="xsd:string">sample product1</item>
    </item>
    <item xsi:type="SOAP-ENC:Array" SOAP-ENC:arrayType="xsd:string[0]"></item>
   </rows>
  </return>
 </ns1:Export.GetData>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>

Обратите внимание на строки:

<rows xsi:type="SOAP-ENC:Array" SOAP-ENC:arrayType="tns:data_warehouse_report_row[2]">
<item xsi:type="SOAP-ENC:Array" SOAP-ENC:arrayType="xsd:string[3]">

WSDL:

<xsd:complexType name="data_warehouse_report">
  <xsd:all>
    <xsd:element name="start_row" type="xsd:int"/>
    <xsd:element name="end_row" type="xsd:int"/>
    <xsd:element name="finished" type="xsd:boolean"/>
    <xsd:element name="rows" type="tns:data_warehouse_report_row_list"/>
  </xsd:all>
</xsd:complexType>

Странно то, что тип data_warehouse_report указывает строки типа как «data_warehouse_report_list», который даже не используется в ответе.

Мой большой вопрос ... Согласно ответу веб-службы, как бы вы создали прокси-объект data_warehouse_report_row?

Я перевел это на:

[System.CodeDom.Compiler.GeneratedCodeAttribute("wsdl", "2.0.50727.3038")]
[System.SerializableAttribute()]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.ComponentModel.DesignerCategoryAttribute("code")]
[System.Xml.Serialization.SoapTypeAttribute(Namespace = "http://www.x.com/")]
public partial class data_warehouse_report_row
{
    private string[] itemField;

    public string[] item
    {
        get
        {
            return this.itemField;
        }
        set
        {
            this.itemField = value;
        }
    }
}

Но все равно жалуются на неправильный тип данных при десериализации ..

Исключение:

InvalidCastException: "Object cannot be stored in an array of this type."

Я пытался использовать отражатель .NET для отладки скомпилированных сборок (в основном System.Xml.Serialization), но трассировка заканчивается на созданной программе чтения созданных сборок, созданной сериализатором ... точно выяснить, из каких данных он пытается получить данные.

Есть идеи?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...