我有一个WCF服务方法,我为返回类型编写了集合类型。
但是如果我生成一个代理类并从客户端使用该方法,则方法返回类型将从集合更改为数组。
为什么会这样?
答案 0 :(得分:5)
记住 - WCF也是一个可互操作的系统,例如您的另一端可能是PHP或Java或Ruby客户端,它们无法理解.NET通用列表!
您可以使用Andrew和Jimmie提到的两个选项指定您想要的通用列表 - 这是有效的,当且仅当您还使用DataContractSerializer(这是WCF的默认选项)时。但是,如果您的服务和/或数据合同无论出于何种原因需要使用XmlSerializer,那么这些设置将无济于事 - 您的列表将再次转换为数组。
所以尝试显示这些选项,如果它们适合你 - 太棒了!但请注意,为什么您的通用列表可能只需要转换为更具互操作性的对象数组,这是有充分理由的。
马克
答案 1 :(得分:2)
您需要告诉svcutil
将类型生成为您想要的任何泛型类型。您可以通过将此开关添加到svcutil命令来执行此操作:
svcutil ..blah... /ct:System.Collections.ObjectModel.Collection`1
/ct
是 /collectionType
的缩写。在这种情况下,我指定了Collection<T>
,但您可以轻松使用System.Collections.Generic.List<T>
。
答案 2 :(得分:1)
如果使用Visual Studio中的“添加服务引用”生成代理,则会出现一个“高级”按钮,该按钮会弹出一个对话框,允许您指定返回类型应该是什么(包括通用类型)。
答案 3 :(得分:0)
如果您使用的是Visual Studio,则只需右键单击服务引用即可对其进行配置。 然后,您可以选择(在高级设置中?)告诉您的应用如何将数组作为集合处理。