WCF返回ArrayOfKeyValueOfintstringKeyValueOfintstring 而不是List 和List instread of List
所以我花了最后几个小时调查这个问题,显然我不是唯一一个。 为什么我的词典和列表被作为数组返回?
我知道为了兼容性,Arrays被用作默认值。 WCF有意识地努力使自己远离.Net依赖。 但我的服务器和客户端都是用C#.Net开发的,所以我没事。
以下是仅针对StackOverflow的类似问题的示例:
- WCF服务返回数组而不是List
- 为什么WCF会像我期望的那样返回myObject []而不是List?
- WCF服务返回一个字典数组
- WCF代理返回数组而不是列表甚至收集类型== Generic.List
- WCF返回数组而不是列表甚至收集类型== Generic.List
- 为什么我的WCF服务返回而ARRAY而不是List?
- 使用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
是否能够正确序列化您返回的所有内容。
我希望找到我的问题的来源将来会帮助其他人。