如何在为MessageContract生成的WSDL中删除ArrayOf

时间:2013-06-14 17:10:46

标签: wcf formatting messagecontract

在我的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时,这个额外的间接性会因为它膨胀代码而受到一点伤害

欢迎任何想法: - )

1 个答案:

答案 0 :(得分:0)

这是因为wcf可以跨语言使用,因此它应该支持常见类型,而不仅仅支持.net特定类型。 如果你想使用带有列表的svcutil生成代理,那么你可以使用示例svcutil wsdl /ct:System.Collections.Generic.List`1创建它,或者如果你使用添加服务引用,那么有一个高级按钮,单击该按钮,然后选择System.Generic.List作为集合。这将解决问题..并且使阵列信息不会损害任何东西,因此它可以保持不变。