这是我的困境,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>
答案 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
对我来说效果很好