2011-07-18 110 views

回答

2

尝试通过IList<T>对于基于WCF的服务并不合适。

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

当你把一个像IList<T>这样的接口放入你的服务合约中时,你没有给序列化程序足够的有关指定形状数据的信息。你关心的只是发送IList<T>部分的实现吗?你是否对实现接口的东西中包含的其他有状态数据感兴趣?序列化程序无法知道。

最简单的解决方案是在WCF中使用基本的数据传输对象。这些都是简单的类,它们只具有表示要通过媒体传输信息的工作。这些类仅包含具体类型,并且很容易被序列化程序理解。当你想发送消息时,你可以创建这些对象的实例并用数据填充它们。

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

+0

谢谢你英雄的好回答。 –

2

串行器需要知道具体的类型,以便与注释[ServiceKnownType],所以它知道可以使用什么类型的IList的

更新合同:对象不帮助尽可能串行仍然没有按”不知道该怎么做 - 你需要使用[ServiceKnownType]来告诉它 - 你可以在这里提供一个方法,如果你不想在编译时显式地返回类型列表

1

你需要使用泛型并标记它是什么类型的列表,以便服务知道该期待什么。一种方法可以是这样的:

public IList<Something> GetSomething() 

这么说,我这样做时,我往往不是仅仅因为有读书迟代码究竟是什么回事返回(做一个非WCF时少猜测返回数组客户端在另一端为它创建一个IList类还是将它转换成其他东西?)。一切都知道数组是什么。

+0

我可以使用此类似:公共IList的 GetObject的()? –

+0

当然,如果你希望人们在另一端得到的是Object。但是由于Object没有数据,这可能不是你想要的。 :)如果你更具体地说明一种方法将要发回的东西,这个东西效果最好。 – Tridus

0

除了使用列表类型
的概念 - 为什么不只是使用数组?

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