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

时间:2011-03-21 21:57:30

标签: 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> 

对于上述架构,以下是代码段生成的代理。请参阅它在属性中生成订单命名参数。尽管架构包含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 个答案:

答案 0 :(得分:2)

我无法用svcutil来抑制“Order”属性,因此我们编写了一个剥离它的Powershell脚本。它很脏,但它可以工作,我们不必担心在我们重新生成时手动剥离它。

我们使用powershell脚本生成我们的代理类,它们删除了“Order”属性:

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

答案 1 :(得分:0)

您也可以尝试:http://wscfblue.codeplex.com

对我来说效果很好