SvcUtil генерирует именованный параметр «Порядок» для xsd: all complexcontent - PullRequest
3 голосов
/ 22 марта 2011

Вот моя дилемма, команда svcutil все еще генерирует параметр Order Named для сложного содержимого, помеченного как xsd: all.

Вот мой пример схемы.

<xsd:complexType name="SpecialReportEntityRow" >
    <xsd:complexContent>
    <xsd:extension base="list:BaseRowExt">
   <xsd:all>
          <xsd:element name="customerName" type="xsd:string" form="unqualified" minOccurs="0" maxOccurs="1" />
    <xsd:element name="Id" type="xsd:long" form="unqualified" minOccurs="0" maxOccurs="1"  />
          <xsd:element name="certificateType" type="xsd:string" form="unqualified" minOccurs="0" maxOccurs="1" />
          <xsd:element name="certificateValidity" type="xsd:long" form="unqualified" minOccurs="0" maxOccurs="1" />
          <xsd:element name="item" type="xsd:long" form="unqualified" minOccurs="0" maxOccurs="1" />
          <xsd:element name="description" type="xsd:string" form="unqualified" minOccurs="0" maxOccurs="1" />
          <xsd:element name="quantity" type="xsd:long" form="unqualified" minOccurs="0" maxOccurs="1" />
          <xsd:element name="startDate" type="xsd:dateTime" form="unqualified" minOccurs="0" maxOccurs="1" />
          <xsd:element name="endDate" type="xsd:dateTime" form="unqualified" minOccurs="0" maxOccurs="1" />
      </xsd:all>
  </xsd:extension>
    </xsd:complexContent>
 </xsd:complexType> 

ДляСхема выше, Вот прокси сгенерированный фрагмент.Пожалуйста, обратите внимание, что он генерирует именованный параметр заказа в атрибуте.Несмотря на то, что схема содержит xsd: all content.

Основная проблема заключается в том, что порядок, в котором служба отправляет эти данные, является буквенным или произвольным порядком, следовательно, схема имеет xsd: all вместо xsd: sequence.Теперь во время выполнения, если у нас есть именованный параметр порядка, объект SpecialReportEntityRow инициализируется значениями по умолчанию, а не данными сервиса.Например, свойство CertificateType инициализируется пустой строкой, а CertificateValidaty инициализируется значением 0, все свойства инициализируются в значения по умолчанию.Во время выполнения не возникает ошибка десериализации.

Если я изменю прокси-класс, удалив именованный параметр XmlElementAttribute Order, то во время выполнения объект SpecialReportEntityRow получит правильные служебные данные.

Может кто-нибудь мне помочькак мне решить эту проблему, я не хочу изменять прокси-класс и почему xsd: all не учитывает svcutil.

/// <remarks/>
[System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=0)]
    public string customerName
    {
        get
        {
            return this.customerNameField;
        }
        set
        {
            this.customerNameField = value;
        }
    }

    /// <remarks/>
    [System.Xml.Serialization.XmlElementAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=1)]
    public long orgId
    {
        get
        {
            return this.orgIdField;
        }
        set
        {
            this.orgIdField = value;
        }
    }

Пример XML-ответа:

<ns5:rows xsi:type="ns7:SpecialReportEntityRow">
           <certificateType>Dummy Type 1</certificateType>
           <certificateValidity>2</certificateValidity>
           <customerName>Customer1</customerName>
           <description>Revocations by Reason - Unused</description>
           <item>17</item>
        </ns5:rows>
        <ns5:rows xsi:type="ns7:SpecialReportEntityRow">
           <certificateType>Dummy Type 2</certificateType>
           <certificateValidity>2</certificateValidity>
           <customerName>Custome1</customerName>
           <description>Revocations by Reason- Ca Compromise</description>
           <item>19</item>
        </ns5:rows>

Ответы [ 2 ]

3 голосов
/ 14 марта 2012

Я не знаю способа подавления атрибута "Порядок" с помощью svcutil, поэтому мы написали скрипт Powershell, который удаляет его.Это грязно, но работает, и нам не нужно беспокоиться о том, чтобы вручную удалять его при регенерации.

Мы используем скрипт powershell для генерации наших прокси-классов, которые удаляют атрибуты «Порядок»:

svcutil /serializer:XmlSerializer '..\.\Schema\MyService.wsdl' '/n:*,MyService.GeneratedCode'  '/o:MyServiceProxy.cs'  '/nologo' 


(Get-Content .\o:MyServiceProxy.cs) | 
Foreach-Object {
$_ -replace ", ReplyAction=`"\*`"", "" `
       -replace ", Order=.", "" `
       -replace "Order=.", ""
} | 
Set-Content .\o:MyServiceProxy.cs
0 голосов
/ 29 ноября 2012

Вы также можете попробовать это: http://wscfblue.codeplex.com

Хорошо работает для меня

...