我有WCF服务。它使用Linq-to-objects从字典中进行选择。对象类型很简单:
public class User { public Guid Id; public String Name; }
中存储了一个集合Dictionary<Guid,User>。
Dictionary<Guid,User>
我想要一个这样的WCF OperationContract方法:
OperationContract
public IEnumerable<Guid> GetAllUsers() { var selection = from user in list.Values select user.Id; return selection; }
它可以很好地编译,但是当我运行它时,我得到:
服务器在处理请求时遇到错误。异常消息是2[Cheeso.Samples.Webservices._2010.Jan.User,System.Guid]' (for operation 'GetAllUsers', contract 'IJsonService') because it is not the exact type 'System.Collections.Generic.IEnumerable方法签名中的’无法序列化’System.Linq.Enumerable + WhereSelectEnumerableIterator 1 [System.Guid] 类型的参数”,并且不在已知的类型集合中。为了序列化参数,请使用ServiceKnownTypeAttribute将类型添加到该操作的已知类型集合中。有关更多详细信息,请参见服务器日志。
2[Cheeso.Samples.Webservices._2010.Jan.User,System.Guid]' (for operation 'GetAllUsers', contract 'IJsonService') because it is not the exact type 'System.Collections.Generic.IEnumerable
如何强制选择成为IEnumerable<Guid>?
IEnumerable<Guid>
编辑 如果我修改代码来执行此操作,则效果很好-良好的互操作性。
public List<Guid> GetAllUsers() { var selection = from user in list.Values select user.Id; return new List<Guid>(selection); }
有没有办法让我避免创建/实例化List<T>?
List<T>
不,必须从Web服务返回一个具体的类。使返回类型为List并完成它。