如何通过WCF服务发送IList?

时间:2011-07-18 09:28:39

标签: c# wcf ilist

我想在我的WCF服务中使用NHibernate,如何通过WCF服务发送IList?

--- ------- EDIT

我可以将IList放入object变量并发送吗?

4 个答案:

答案 0 :(得分:3)

尝试传递IList<T>并不适合基于WCF的服务。

WCF就数据合同进行谈判,定义服务或客户希望发送和接收的数据的形状。这些契约必须足够具体,以便序列化程序知道如何将它们转换为XML,JSON和其他表示形式。

当您将IList<T>之类的界面放入服务合同时,您不会向序列化程序提供有关指定数据形状的足够信息。您是否只关心发送IList<T>部分实施?您是否对实现该接口的任何其他有状态数据感兴趣?序列化器无法知道。

最简单的解决方案是使用基本数据传输对象和WCF。这些是简单的类,它们只能表示要通过介质传输的信息。这些类只包含具体类型,序列化程序很容易理解。当您想要发送消息时,您可以创建这些对象的实例并用数据填充它们。

对于您的示例,请创建List<T>而不是IList<T>,并在将值传递到服务之前将值复制到列表中。一种简单的方法是使用Enumberable.ToList<T>()扩展方法。

答案 1 :(得分:2)

序列化程序需要知道具体类型,因此使用[ServiceKnownType]注释合同,以便它知道可以用于IList的类型

更新:对象无效,因为序列化程序仍然不知道该怎么做 - 您需要使用[ServiceKnownType]告诉它 - 您可以提供一个返回列表的方法如果您不希望在编译时显式,则为类型

答案 2 :(得分:1)

您需要使用泛型并标记它是什么类型的列表,以便服务知道会发生什么。方法可以如下所示:

public IList<Something> GetSomething()

那就是说,当我这样做时,我倾向于返回一个数组,而不是因为在稍后读取代码的时候会更少猜测它将返回的确切内容(另一端的非WCF客户端是否为它创建了一个IList类)还是将它转换成其他东西?)。一切都知道阵列是什么。

答案 3 :(得分:0)

除了使用List类型的概念外 - 为什么不使用数组呢?

数组似乎是最明显的选择,因为它与IEnumerable兼容,客户端可以使用自己的扩展方法