SvcUtil 为 xsd:all complexcontent 生成“Order”命名参数

M.N*_*ikh 3 xsd svcutil.exe

这是我的困境,svcutil 命令仍然为标记为 xsd:all 的复杂内容生成 Order Named 参数。

这是我的示例架构。

<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> 
Run Code Online (Sandbox Code Playgroud)

对于上述架构,这是生成的代理片段。请注意它在属性中生成订单命名参数。尽管架构包含 xsd:all 内容。

主要问题是服务发送数据的顺序是字母顺序或任何随机顺序,因此模式有 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;
        }
    }
Run Code Online (Sandbox Code Playgroud)

示例响应 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>
Run Code Online (Sandbox Code Playgroud)

Mik*_*ill 5

据我所知,无法使用 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
Run Code Online (Sandbox Code Playgroud)