Service Reference使用Arrays而不是List <type>,即使设置说使用List </type>也是如此

时间:2010-07-01 16:20:21

标签: c# web-services

我正在使用Visual Studio 2010,并且我已经获得了对我们创建的Web服务的服务引用。我们的方法返回包含通用List属性的对象:

public class ExampleResponse
{
  private System.Collections.Generic.List<int> intValues;

  [WCF::MessageBodyMember(Name = "IntValues")]
  public System.Collections.Generic.List<int> IntValues    
  {
    get { return intValues; }
    set { intValues= value; }
  }
}

在客户端,它使用int []而不是List:

创建一个References.cs文件
[System.ServiceModel.MessageBodyMemberAttribute(Namespace="SomeNamespace", Order=0)]
[System.Xml.Serialization.XmlArrayAttribute(IsNullable=true)]
[System.Xml.Serialization.XmlArrayItemAttribute(Namespace="http://schemas.microsoft.com/2003/10/Serialization/Arrays", IsNullable=false)]
public int[] IntValues;

在服务引用设置上,Collection Type设置为使用List,而不是Arrays。然而,它仍在这样做。

任何关于如何解决这个问题的信息都会非常有用,似乎毫无意义。

2 个答案:

答案 0 :(得分:9)

您是否添加了“服务参考”或“网络参考”?似乎代理是使用XmlSerializer而不是DataContractSerializer生成的。如果使用DataContractSerializer,您将拥有System.Runtime.Serialization ... Attributes而不是Xml.Serialization ...属性。您是如何生成此Web引用的?更新后的XmlSerializer会将所有集合转换为Arrays,而Datacontract序列化程序知道如何生成.Net DataTypes。添加Web引用使用XmlSerializer BTW。

另外,我很好奇你使用MessageBodyMember。你为什么要尝试生成自己的MessageContracts。与MessageContracts混淆可能非常危险,特别是如果您不确切知道自己在做什么。

相反,请尝试以下方法:

[DataContract]
public class ExampleResponse
{
    private System.Collections.Generic.List<int> intValues;

    [DataMember]
    public System.Collections.Generic.List<int> IntValues
    {
        get { return intValues; }
        set { intValues = value; }
    }
}

了解这对您有何帮助并告诉我们。

答案 1 :(得分:2)

在“添加服务引用”中,您可以选择要用于集合的类型。由于某种原因,Array是默认的。更改后,我必须删除整个引用并重新添加它,从头开始选择List。事后,我有一些奇怪的问题在改变它。