在我的Web服务中,我想摆脱WSDL中生成的ArrayOf ...定义,这些定义是通过调用... service.svc?singleWsdl生成的。
目前定义看起来像(我尝试使用XmlArray等所有品种):
[DataContract]
public class Incident {...}
[CollectionDataContract(Name = "IncidentList", ItemName = "IncidentItem")]
public class IncidentList : List<Incident>
{
public IncidentList()
: base()
{ }
public IncidentList(IEnumerable<Incident> list)
: base(list)
{ }
}
[MessageContract]
public class IncidentsResponse
{
[MessageBodyMember]
public Incident[] Incidents { get; set; }
[MessageBodyMember]
public IncidentList IncidentList { get; set; }
}
当我获得WSDL时,我总是收到(或多或少 - 取决于Name属性等):
<xs:element name="IncidentsResponse">
<xs:complexType><xs:sequence>
<xs:element minOccurs="0" maxOccurs="1" name="IncidentList" type="tns:ArrayOfIncident"/><xs:element minOccurs="0" maxOccurs="1" name="Incidents" type="tns:ArrayOfIncident"/>
</xs:sequence>
</xs:complexType></xs:element>
我真正想要的是直接在元素中列出的类型,如
<xs:element name="IncidentsResponse">
<xs:complexType>
<Incidents><IncidentItem>...</IncidentItem><IncidentItem>...</IncidentItem> </Incidents>
<IncidentList><IncidentItem>...</IncidentItem><IncidentItem>...</IncidentItem></IncidentList>
</xs:complexType></xs:element>
因此引用实际数据,而不是列表类型(ArrayOf)。
有任何方法可以实现这一目标吗?如果我得到正确的信息,CollectionDataContract属性应该可以做到这一点,但不知何故它没有......
特别是当消费客户端是Java时,这个额外的间接性会因为它膨胀代码而受到一点伤害
欢迎任何想法: - )
答案 0 :(得分:0)
这是因为wcf可以跨语言使用,因此它应该支持常见类型,而不仅仅支持.net特定类型。 如果你想使用带有列表的svcutil生成代理,那么你可以使用示例svcutil wsdl /ct:System.Collections.Generic.List`1创建它,或者如果你使用添加服务引用,那么有一个高级按钮,单击该按钮,然后选择System.Generic.List作为集合。这将解决问题..并且使阵列信息不会损害任何东西,因此它可以保持不变。