【问题标题】:Can we send a Generic List ( List<customObject>) as a parameter to a WCF OperationContract?我们可以将通用列表 (List<customObject>) 作为参数发送到 WCF OperationContract 吗?
【发布时间】:2013-03-16 12:30:37
【问题描述】:

我们可以将通用列表 (List) 作为参数发送到 WCF OperationContract 吗?

似乎唯一的方法是将 List 作为 DataMember 封装在另一个 Class 中,并将该类指定为 DataContract:

但这在我看来并不正确。有没有其他办法?

编辑1:
预期签名:

[OperationContract]  
List<int> OperationName(List<CustomObject> objects);  

这在客户端转换为 CustomObject[]。我目前正在从我的客户传递 CustomObject[] 并且它工作正常,但我想知道为什么我不能通过

  List <CustomObject> 

这给了我一个编译错误,说没有采用指定参数的函数的重载版本(类型不匹配错误)

编辑 2:
相关问题:
1)我应该能够从服务本身控制这一点。如果我将我的服务公开给全世界,而 wsdl/Proxy 是他们知道我的 OperationContract 签名的唯一方式,该怎么办?
2) 如果我想在同一个服务合同的不同操作合同中同时使用 System.Array 和 System.Generic.List 怎么办?

【问题讨论】:

  • 你能分享一下无效的操作合同的预期签名吗?
  • 用签名*编辑问题,谢谢
  • 这个问题和stackoverflow.com/questions/8445502/…的问题很相似
  • 感谢@Dhawalk。您发布的链接建议更改客户端服务参考上的设置。我也许可以使用这个解决方案。但更广泛的问题仍然存在:1)我应该能够从服务本身控制这一点。如果我将我的服务公开给全世界,而 wsdl/Proxy 是他们知道我的 OperationContract 签名的唯一方式,该怎么办? 2) 如果我想在同一个服务合同的不同操作合同中同时使用 System.Array 和 System.Generic.List 怎么办? ...我觉得这不太整洁。
  • 我建议您编辑您的问题以包含您提出的 2 个 mor 问题

标签: wcf parameter-passing datacontract generic-collections operationcontract


【解决方案1】:

List 是一种高级类型,可能不适用于所有编程范例。相比之下,数组可能在所有编程范式中都可用。因此默认情况下,翻译将落入代理 wsdl 的数组中

现在在这种情况下,如果您确定您的客户端是 .Net,您可以将客户端更改为使用 List。由于服务不知道客户端的编程语言是什么,因此客户端决定使用列表还是数组的 svcutil 的当前设计是正确的。如果您在服务中提供此设置,您将排除没有列表概念的客户端

回到你的第二个问题,只要你的操作合约名称不同,你就可以在同一个服务中分别使用数组和列表。另请注意,OOP 概念在 SOA 中受到限制,这意味着您不能拥有多态方法。

以下问题有更多关于 OOP 和 SOA 的详细信息

WCF Object Design - OOP vs SOA

【讨论】:

  • 很好的解释,谢谢。 “...现在在这种情况下,如果您确定您的客户端是 .Net,您可以将客户端更改为使用 List”...无论如何,我的 .Net 客户端是否可以知道他可以使用 List 而无需我告诉他?我想人们会期待这样的事情。无论如何,非常感谢你让我的许多恶魔安息......现在;)
猜你喜欢
  • 2012-03-10
  • 2014-10-21
  • 1970-01-01
  • 2021-11-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-08-09
  • 2021-04-14
相关资源
最近更新 更多