我想在我的WCF服务中使用NHibernate,如何通过WCF服务发送IList?
--- ------- EDIT
我可以将IList放入object
变量并发送吗?
答案 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兼容,客户端可以使用自己的扩展方法