如何在.NET WCF Web服务中指定元素序列而不是元素数组?

时间:2011-06-08 22:03:44

标签: .net wcf xsd wsdl

我有一个.NET 4 WCF Web服务,它使用可选的可枚举字符串获取数据协定。例如:

服务代码:

[DataMember(IsRequired = true)]
public string Something {
    get { return _Something; }
    set { _Something= value; }
}
private string _Something;

[DataMember(IsRequired = false)]
public string[] MoreThings {
    get { return _MoreThings.ToArray<string>(); }
    set { _MoreThings  = new List<string>(value); }
}
private List<string> _MoreThings = new List<string>();

WSDL:

  <xsd:complexType name="MyDataContract">
    <xsd:sequence>
      <xsd:element minOccurs="1" name="Something" type="xsd:string" /> 
      <xsd:element minOccurs="0" name="MoreThings" nillable="true" type="q1:ArrayOfstring" xmlns:q1="http://schemas.microsoft.com/2003/10/Serialization/Arrays" /> 
    </xsd:sequence>
  </xsd:complexType>

我正在尝试与来自多个不同平台的服务进行交互,但其中一个是Perl使用SOAP :: WSDL(特别是wsdl2perl.pl),这似乎无法识别“ArrayOfstring”。我可以在我的代码中做些什么,以便WSDL可以这样读:

  <xsd:complexType name="MyDataContract">
    <xsd:sequence>
      <xsd:element minOccurs="1" name="Something" type="xsd:string" /> 
      <xsd:element minOccurs="0" maxOccurs="unbounded" name="MoreThings" nillable="true" type="xsd:string" /> 
    </xsd:sequence>
  </xsd:complexType>

我也对其他建议持开放态度。基本上,我正在尝试做类似于声明方法MyOperation(string something,params string [] moreThings),其中可以传递任何数量的其他moreThings参数,但是以不会导致非互操作问题的方式-.NET平台。

1 个答案:

答案 0 :(得分:3)

我认为您无法通过DataContractSerializer实现这一目标 - 您必须切换到XmlSerializer。您可以简单地获取所需的模式,并让工具(运行VS命令提示符)为您生成类。

  • DataContractSerizlizer使用svcutil.exe /dataContractsOnly File.xsd,但正如我之前提到的,我认为DataContract不能代表您的架构
  • XmlSerializer使用:xsd.exe /classes File.xsd

获得类文件后,只需将其添加到服务项目中,然后在服务的操作中使用它。如果是XmlSerializer,您必须使用XSD.exe生成的XmlSerializerFormat属性类型标记整个服务合同/实施或操作合同/实施。