为什么在WCF服务中添加类型化数据集会强制客户端使用数组进行集合?

时间:2014-06-21 02:41:27

标签: .net wcf visual-studio

我有一个WCF服务和一个WCF客户端。该服务使用返回通用列表的方法,并将客户端的服务引用集合类型设置为通用列表。一切正常。

我向WCF服务添加了一个返回类型化数据集的方法。返回数据集的第一个操作契约。更新了客户端中的服务引用,它破坏了一切。即使集合类型设置为通用列表,所有列表也都转换为数组。

我认为有些事情变得糟糕,所以我删除了服务引用,reran VS,从头开始创建服务引用,但仍然将所有集合转换为数组而不是列表。

我确认数据集导致这种情况,因为当我从WCF服务中删除新方法并更新引用时,所有集合都返回到列表。

我需要按原样使用数据集。我该如何使用它并保留其余列表完好无损?为什么键入的数据集会干扰正在使用的其他集合的类型?我正在使用VS 2013更新2和.NET 4.5.1。

enter image description here

2 个答案:

答案 0 :(得分:1)

原因是当您通过visual studio添加服务引用时,Visual Studio会调用svcutil.exe来生成代理。这很好,因为正如您的屏幕截图所示,svcutil能够将公开的服务定义wsdl上的集合解释为List<T>

这通常适用于简单合约。

现在,由于只有微软知道的一个模糊的原因,svcutil有一个相当fussy interpretation的XSD,这意味着对于不属于这种解释的服务定义,VS将依赖于使用旧的xsd.exe,碰巧不支持集合为List<T>

通常您不会注意到这一点,因为大多数服务定义都相对简单并且遵守规则。然而,将类似.net DataSet对象的内容转储到服务合同中,并且您的服务定义变得非常复杂,以至于VS必须使用xsd.exe来生成代码。

这就是问题所在。

你可以尝试一些事情:

  1. 从服务WSDL中提取XSD并尝试直接调用svcutil:svcutil /o:file.cs /ct:System.Collections.Generic.List schema.xsd(可能无法正常工作,但我会尝试以防万一)

  2. 手动修改生成的代码,用列表替换所有数组(ouch)

  3. 不要将.net数据集转储到服务定义中(这是我最喜欢的)

  4. 使用像XsdArrayToList这样的工具 - 这将允许您重新生成您的代码。

答案 1 :(得分:0)

我将服务方法移至旧版Web服务(asmx)服务。