Svcutil не создает все классы - PullRequest
0 голосов
/ 21 февраля 2019

Я хочу вызвать внешнюю службу SOAP, для которой я хочу сгенерировать прокси-классы..Wsdl не отображается в Интернете, но предоставляется вместе с набором файлов .xsd.Затем я использую svcutil (также пробовал с dotnet-svcutil 1.0.4) для генерации классов.Рассмотрим следующий XML:

<xs:complexType name = "ValidationReply" abstract="false">
  <xs:complexContent>
    <xs:extension base="common:Reply">
      <xs:sequence>
        <xs:element name="data" type="ns:ValidationReplyData" minOccurs="0" maxOccurs="1"/>
      </xs:sequence>
    </xs:extension>
  </xs:complexContent>
</xs:complexType>
<xs:complexType name="ValidationReplyData" abstract="false">
  <xs:sequence>
    <xs:element name="errors" type="ns:Error" minOccurs="0" maxOccurs="unbounded"/>
  </xs:sequence>
</xs:complexType>

Создает следующий код:

/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("dotnet-svcutil", "1.0.4")]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="Namespace")]
public partial class ValidationReply: Reply
{

    private Error[] dataField;

    /// <remarks/>
    [System.Xml.Serialization.XmlArrayAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=0)]
    [System.Xml.Serialization.XmlArrayItemAttribute("errors", Form=System.Xml.Schema.XmlSchemaForm.Unqualified, IsNullable=false)]
    public Error[] data
    {
        get
        {
            return this.dataField;
        }
        set
        {
            this.dataField = value;
        }
    }
}

Проблема заключается в том, что XML определяет внутренний тип, содержащий список ошибок, где Svcutil помещает списокошибки непосредственно в качестве поля данных, вместо этого создается поле данных типа ValidationReplyData.ValidationReplyData не генерируется вообще.

Код компилируется без проблем, и я могу вызвать внешнюю службу без ошибок.Однако поле данных всегда равно нулю, поскольку ответ имеет формат:

<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
  <S:Body>
    <fl:ValidationReply xmlns:fw="Namespace" >
      <data>
        <errors>
          <code>236</code>
        </errors>
        <errors>
          <code>237</code>
        </errors>
      </data>
    </fl:ValidationReply>
  </S:Body>
</S:Envelope>

, который не десериализован правильно для сгенерированного класса.

Короче, кто-нибудь знает, как заставить Svcutil генерировать все классы?Избыточный или нет.

Я упростил фрагменты xml, поэтому в этом примере могут быть некоторые несоответствия, но проблема заключается в отсутствующем классе ValidationReplyData-

...