Wcf 如何去除MessageContract生成的WSDL中的ArrayOf

Wcf 如何去除MessageContract生成的WSDL中的ArrayOf,wcf,formatting,messagecontract,Wcf,Formatting,Messagecontract,在我的web服务中,我想去掉生成的。。。通过调用…service.svc?singleWsdl生成的WSDL中的定义 目前定义如下(我使用XmlArray等尝试了所有变体): [DataContract] 公共类事件{…} [CollectionDataContract(Name=“IncidentList”,ItemName=“IncidentItem”)] 公共类意外事件列表:列表 { 公共事故清单() :base() { } 公共事故清单(IEnumerable list) :基

在我的web服务中,我想去掉生成的。。。通过调用…service.svc?singleWsdl生成的WSDL中的定义

目前定义如下(我使用XmlArray等尝试了所有变体):

[DataContract]
公共类事件{…}
[CollectionDataContract(Name=“IncidentList”,ItemName=“IncidentItem”)]
公共类意外事件列表:列表
{
公共事故清单()
:base()
{      }
公共事故清单(IEnumerable list)
:基本(列表)
{        }
}
[信息合同]
公共类事件响应
{
[MessageBodyMember]
公共事件[]事件{get;set;}
[MessageBodyMember]
公共意外事件列表意外事件列表{get;set;}
}
当我得到WSDL时,我总是收到(或多或少-取决于名称属性等):


我真正想要的是元素中直接列出的类型,比如


...... 
......

因此,引用实际数据本身,而不是列表类型(ArrayOf)

有什么办法可以做到这一点?如果我得到了正确的信息,CollectionDataContract属性应该可以做到这一点,但不知何故它没有

特别是当消费客户机是Java时,这种额外的间接操作会使代码膨胀,从而造成一定的伤害


欢迎使用任何想法:-)

这是因为wcf可以跨语言使用,因此它应该支持公共类型,而不是只支持.net特定类型。
但是,如果您想使用svcutil with list生成代理,则可以使用示例svcutil wsdl/ct:System.Collections.Generic.list`1创建代理。如果您正在使用添加服务引用,则有一个高级按钮,请单击该按钮并选择System.Generic.list作为您的集合。这将解决问题。。拥有数组信息不会损害任何东西,因此可以保持原样。

问题在于客户端是Java客户端(因此没有svcutil),它通过使用调用服务来获取WSDLhttp://.../service.svc?singleWsdl. 特别是这个额外的类(ArrayOf…)也会在Java中生成,并导致(不必要的)间接寻址。我的意思是,世界并没有停止转动-它只是丑陋,我希望能够摆脱它,特别是当MS提到输出行为可以调整时-问题是如何:-)由于客户端是java,它无法理解.Net中定义的列表类,这就是WSDL生成类型的原因(这就是为什么我们有通用语言规范,这样您就可以实现互操作性)哪种Java也能理解。如果你的客户机是.Net,那么尝试更改类型是有意义的。你仍然希望更改类型吗?如果是这样,那么我不理解这样做的目的,也不知道你会提到什么类型以使其可互操作?或者我理解错了你的问题。
[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; }
}