我想调用一个我想为其生成代理类的外部SOAP服务。 .wsdl不会在线公开,而是与一组.xsd文件一起提供。然后,我使用svcutil(也与dotnet-svcutil 1.0.4一起尝试过)来生成类。考虑以下XML:
<xs:complexType name = "ValidationReply" abstract="false">
<xs:complexContent>
<xs:extension base="common:Reply">
<xs:sequence>
<xs:element name="data" type="ns:ValidationReplyData" minOccurs="0" maxOccurs="1"/>
</xs:sequence>
</xs:extension>
</xs:complexContent>
</xs:complexType>
<xs:complexType name="ValidationReplyData" abstract="false">
<xs:sequence>
<xs:element name="errors" type="ns:Error" minOccurs="0" maxOccurs="unbounded"/>
</xs:sequence>
</xs:complexType>
生成以下代码:
/// <remarks/>
[System.CodeDom.Compiler.GeneratedCodeAttribute("dotnet-svcutil", "1.0.4")]
[System.Diagnostics.DebuggerStepThroughAttribute()]
[System.Xml.Serialization.XmlTypeAttribute(Namespace="Namespace")]
public partial class ValidationReply: Reply
{
private Error[] dataField;
/// <remarks/>
[System.Xml.Serialization.XmlArrayAttribute(Form=System.Xml.Schema.XmlSchemaForm.Unqualified, Order=0)]
[System.Xml.Serialization.XmlArrayItemAttribute("errors", Form=System.Xml.Schema.XmlSchemaForm.Unqualified, IsNullable=false)]
public Error[] data
{
get
{
return this.dataField;
}
set
{
this.dataField = value;
}
}
}
问题是XML定义了一个包含错误列表的内部类型,其中Svcutil将错误列表直接放置为数据字段,而不是将数据字段设置为ValidationReplyData类型。根本不会生成ValidationReplyData。
代码可以编译,没有任何问题,而且我能够正确地调用外部服务。但是,数据字段始终为null,因为响应的格式为:
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/">
<S:Body>
<fl:ValidationReply xmlns:fw="Namespace" >
<data>
<errors>
<code>236</code>
</errors>
<errors>
<code>237</code>
</errors>
</data>
</fl:ValidationReply>
</S:Body>
</S:Envelope>
没有正确反序列化生成的类。
简而言之,有人知道如何强制Svcutil生成所有类吗?是否冗余。
我简化了xml代码段,因此示例中可能存在一些不一致之处,但是问题的摘要是缺少的ValidationReplyData类-