我正在使用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。然而,它仍在这样做。
任何关于如何解决这个问题的信息都会非常有用,似乎毫无意义。
答案 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。事后,我有一些奇怪的问题在改变它。