这是我的困境,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)
据我所知,无法使用 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)