2010-03-26 116 views
11

在Web servce我说为什么我的WCF服务返回和ARRAY而不是列表<T>?

public List<Customer> GetCustomers() 
    { 
     PR1Entities dc = new PR1Entities(); 
     var q = (from x in dc.Customers 
       select x).ToList(); 
     return q; 
    } 

(客户是一个实体对象)

然后我生成代理,当我添加的服务..并在reference.cd它说

public wcf1.ServiceReference1.Customer[] GetCustomers() { 
     return base.Channel.GetCustomers(); 
    } 

为什么它是一个阵列?我问了一个List。

帮助。

回答

26

右键单击服务参考并选择配置服务参考。

在集合类型下拉列表中,选择类型System.Collections.Generic.List。

我相信它默认为Array的原因是它是序列化时最兼容的。如果您从某种能够识别更复杂的东西中获取服务,则可以按照我所提到的进行配置。

+0

有趣。在使用silverlight而不是ASP.NET时,其工作原理是否完全相同? – punkouter 2010-03-26 18:53:21

+0

我不确定你的意思是完全相同的,但我已经能够在Silverlight中完全配置这种类型的投射而没有问题。默认情况下,Silverlight会将数组转换为ObservableCollections以利用高级绑定功能。 总之,我相信你正在寻找的答案是,是的! – 2010-03-26 20:38:18

1

因为这就是列表序列化的方式。客户端的Customer类是从服务元数据生成的,它有效地描述了它如何被序列化,而不是最初定义的。如果您的原始Customer类可用,则可以在生成服务引用时指定在客户端代码中重新使用它,然后它将作为List<T>来完成。

3

右键单击您的服务参考 - >配置服务参考 - >在“数据类型”下,将“集合类型”更改为System.Collections.ArrayList或您希望阵列反序列化的任何类型。

将您的列表序列化为一个数组(服务器端)。你选择如何反序列化它(客户端)。

2

我有我的设置为System.Collections.Generic.List,但突然当我做更新服务引用时,我生成的代理正在返回数组类型!那是怎么回事?

+0

你解决了你的问题吗?我处于同样的情况。 – 2012-12-28 07:15:30

+0

我也一直有这个问题。它肯定设置为Generic.List。 =/ – JHubbard80 2013-06-24 21:21:11

+0

我有同样的问题。解决我的这里:http://stackoverflow.com/questions/16657982/wcf-returns-arrayofkeyvalueofintstringkeyvalueofintstring-instead-of-dictionar – 2013-07-25 14:02:08

相关问题