WCF返回ArrayOfKeyValueOfintstringKeyValueOfintstring 而不是List 和List instread of List

所以我花了最后几个小时调查这个问题,显然我不是唯一一个。 为什么我的词典和列表被作为数组返回?

我知道为了兼容性,Arrays被用作默认值。 WCF有意识地努力使自己远离.Net依赖。 但我的服务器和客户端都是用C#.Net开发的,所以我没事。

以下是仅针对StackOverflow的类似问题的示例:

  1. WCF服务返回数组而不是List
  2. 为什么WCF会像我期望的那样返回myObject []而不是List?
  3. WCF服务返回一个字典数组
  4. WCF代理返回数组而不是列表甚至收集类型== Generic.List
  5. WCF返回数组而不是列表甚至收集类型== Generic.List
  6. 为什么我的WCF服务返回而ARRAY而不是List?
  7. 使用svcutil.exe生成的WCF服务代理中的数组而不是列表

我设置的内容: 服务参考配置

我通过这个命令生成代理:

C:\Program Files (x86)\Microsoft SDKs\Windows\v7.0A\Bin>svcutil.exe /language:cs /out:generatedProxy.cs /config:app.config /ct:System.Collections.Generic.List`1 http://192.168.0.99:9000/ProjectDatabase/?? 

我的服务合同如下:

 [ServiceContract] public interface IMyContract { [OperationContract] [ServiceKnownType(typeof(Dictionary))] Dictionary getClassDictionary(); } 

我的实施:

 public Dictionary  getClassDictionary() { Dictionary myDict = new Dictionary(); myDict.Add(1, "Geometry"); myDict.Add(2, "Algebra"); myDict.Add(3, "Graph Theory"); return myDict; } 

即使在我的Reference.svcmap我也有:

    

然而,尽管我付出了最大的努力和研究,我仍然得到:

Dictionary 返回为ArrayOfKeyValueOfintstringKeyValueOfintstring []

和:

列表返回为T []

我觉得我已经尝试过所有事情并且做得很对,但我必须要错过一些东西。 那是什么? 感谢您的时间,帮助和考虑。

更新:

我甚至试图通过编写可serializable struct并将它们添加到数组中来解决Array拼版的问题。

 [Serializable] public struct KeyValuePair { public K Key { get; set; } public V Value { get; set; } } 

但是,当我返回KeyValuePair[] 。 我的代理生成了KeyValuePairOfintstring[]的返回。

解决方案发布在下面。

好吧,我发现是什么导致序列化如此粗糙。

在我的ServiceContract我有以下内容:

 [OperationContract] List ShowTables(); [OperationContract] DataTable FetchContacts(string filter = "All"); [OperationContract] DataTable FetchUsers(); [OperationContract] DataTable FetchDrops(); 

在对此进行评论并重新编译我的WCF服务库之后,我发现在生成代理时,所有内容都已正确序列化/反序列化。

似乎当svcutil.exe遇到它不知道如何序列化的东西时,所有的赌注都关闭了。 从字面上看,它会忽略您的命令/设置,并将所有内容序列化为像ArrayOfKeyValueOfinttringKeyValueOfintstring这样的ArrayOfKeyValueOfinttringKeyValueOfintstring 。 因此,如果您收到此错误,您应该问自己svcutil.exe是否能够正确序列化您返回的所有内容。

我希望找到我的问题的来源将来会帮助其他人。