我一直在努力寻找一个具体的答案,解释为什么IEnumerable类型在操作契约中将它们用作返回类型时会导致奇怪的错误。
我发现很多文章和论坛发布,但我现在所拥有的是如何防止其他替代解决方案的错误,如对象数组或通用列表List。
我希望社区成员建议更相关的帖子或任何可以解释此WCF行为的参考资料。
答案 0 :(得分:22)
WCF使用消息传递系统 - 它将调用序列化并将值返回到XML序列化消息中。
因此,它只能处理可以用XML模式表达的东西 - 而接口在XML模式中是不可表达的。
尝试使用具体类型(一个List<T>
或数组) - 那些应该可以正常工作。
有一些方法可以解决这个问题 - 但是您在此过程中牺牲了与非.NET客户端的任何互操作性:您可以使用NetDataContractSerializer
(请参阅this blog post和article by Aaron Skonnard on NetDataContractSerializer );有了这个,你基本上在序列化的消息中嵌入了额外的.NET运行时信息。这将使您的消息变得更大,并且任何非.NET客户端都不会理解这一点,但如果您控制线路的两端并且两端都只是.NET,那么这可能是一种解决方法。
这也支持使用接口作为服务方法参数 - 但不确定返回类型。
我通常不建议这样做 - 但根据您的情况和您的需求,这可能是您的替代选择。看看吧!