为啥 WCF 会返回 myObject[] 而不是 List<T> 像我期望的那样?

Posted

技术标签:

【中文标题】为啥 WCF 会返回 myObject[] 而不是 List<T> 像我期望的那样?【英文标题】:Why does WCF return myObject[] instead of List<T> like I was expecting?为什么 WCF 会返回 myObject[] 而不是 List<T> 像我期望的那样? 【发布时间】:2010-10-04 08:23:45 【问题描述】:

我正在从我的 WCF 方法返回一个列表。在我的客户端代码中,它的返回类型显示为 MyObject[]。我必须使用 MyObject[]、IList 或 IEnumerable...

WCFClient myClient = new WCFClient();

    MyObject[] list = myClient.GetMyStuff();
or
    IList<MyObject> list = myClient.GetMyStuff();
or
    IEnumerable<MyObject> list = myClient.GetMyStuff();

我所做的只是获取这个集合并将其绑定到一个网格。分配我返回的集合的最佳对象是什么?

【问题讨论】:

【参考方案1】:

您可以通过在添加引用时单击高级按钮来指定要使用通用列表而不是数组,或者您可以右键单击服务引用并选择配置以将其更改到位。

原因是 WCF 将通用列表序列化为数组以通过网络发送。该配置只是告诉 svcutil 创建一个代理,将它们转换回通用列表以方便您使用。

【讨论】:

您能否在服务项目本身内执行此操作,以便在生成 WCF 测试客户端时获得 LIST 而不是 TYPE[] ? 有一种方法可以直接从 svcutil 进行配置?,我需要通过 svcutil 以这种方式创建它,因为我将各种 Web 服务序列化为一个名称空间。我如何使用svcutil 返回一个列表?【参考方案2】:

当您使用svcutil.exe 创建您的客户端代码时,您需要告诉它如何解决它不可用的某些引用。

这就是List&lt;T&gt; 的方式:

svcutil /o:YourService.cs /ct:System.Collections.Generic.List`1 http://example.com/mex

【讨论】:

这是一个很好的解决方案,但不能处理“我将 C# 与 C# 一起使用”的一般情况,并且不需要始终手动解析具有过多的常见集合类型的额外步骤我正在制作和部署的服务”【参考方案3】:

Stever B 是正确的。 WCF 非常努力地不与 .NET 耦合。您可能希望允许 Java 客户端连接到您的组件。数组是可互操作的。通用 .NET 列表不是。

但是,我们非常欢迎您创建自己的代理类,它将数组转换回 List 或您想要的任何其他内容。手动创建自己的代理的好处是您可以完全控制它们的工作。

【讨论】:

【参考方案4】:

当您将服务引用添加到客户端项目时,单击高级按钮并将集合类型从数组更改为您想要的...

【讨论】:

以上是关于为啥 WCF 会返回 myObject[] 而不是 List<T> 像我期望的那样?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 WCF/JSON 不为 null 返回值返回“null”?

为啥我必须使用 WCF 而不是 Web 服务? [复制]

为啥从 WCF 服务返回数据集或数据表不是一个好习惯?啥是替代品?

可以/为啥在返回类型中使用 char * 而不是 const char * 会导致崩溃?

WCF 代理返回数组而不是列表,即使集合类型 == Generic.List

WCF / SVC 在使用 StreamReader 时返回 HTML 错误页面而不是 JSON