我有一个.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平台。
答案 0 :(得分:3)
我认为您无法通过DataContractSerializer
实现这一目标 - 您必须切换到XmlSerializer
。您可以简单地获取所需的模式,并让工具(运行VS命令提示符)为您生成类。
DataContractSerizlizer
使用svcutil.exe /dataContractsOnly File.xsd
,但正如我之前提到的,我认为DataContract
不能代表您的架构XmlSerializer
使用:xsd.exe /classes File.xsd
获得类文件后,只需将其添加到服务项目中,然后在服务的操作中使用它。如果是XmlSerializer
,您必须使用XSD.exe
生成的XmlSerializerFormat
属性类型标记整个服务合同/实施或操作合同/实施。