【问题标题】:WCF returns ArrayOfKeyValueOfintstringKeyValueOfintstring[] instead of Dictionary<int, string> and Array instread of ListWCF 返回 ArrayOfKeyValueOfintstringKeyValueOfintstring[] 而不是 Dictionary<int, string> 和 List 的 Array instread
【发布时间】:2013-05-15 12:15:16
【问题描述】:

所以我过去几个小时一直在调查这个问题,很明显我不是唯一一个。为什么我的字典和列表作为数组返回?

我了解出于兼容性考虑,默认使用数组。 WCF 有意识地努力远离 .Net 依赖。但是我的服务器和客户端都是用 C# .Net 开发的,所以我没事。

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

  1. WCF service returning array instead of List
  2. Why does WCF return myObject[] instead of List like I was expecting?
  3. WCF service returning an array of dictionary
  4. WCF Proxy Returning Array instead of List EVEN THOUGH Collection Type == Generic.List
  5. WCF Returning Array instead of List EVEN THOUGH Collection Type == Generic.List
  6. Why does my WCF service return and ARRAY instead of a List ?
  7. Array instead of List in WCF Service Proxy Generated using svcutil.exe

我的设置:

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

 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<int, string>))]
    Dictionary<int, string> getClassDictionary();
}

我的实现:

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

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

<CollectionMappings>
  <CollectionMapping TypeName="System.Collections.Generic.List`1" Category="List" />
</CollectionMappings>

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

字典 返回为 ArrayOfKeyValueOfintstringKeyValueOfintstring[]

还有:

List 返回为 T[]

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

更新:

我什至尝试通过编写serializable struct 并将它们添加到数组中来解决Array 强制执行的方法。

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

但是,当我返回 KeyValuePair&lt;int, string&gt;[] 时。我的代理正在生成KeyValuePairOfintstring[] 的返回。

解决方案发布在下方。

【问题讨论】:

  • 我喜欢这个ArrayOfKeyValueOfintstringKeyValueOfintstring[]
  • 为什么会这样生成代理?
  • 奇怪。我刚刚构建了一个返回Dictionary&lt;int, string&gt; 的新服务、主机和客户端,它工作得很好。明天我会写一个新的解决方案,看看是否能解决问题。

标签: c# wcf serialization collections client-server


【解决方案1】:

嗯,我发现了导致序列化如此粗糙的原因。

在我的ServiceContract 中,我有以下内容:

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

在将其注释掉并重新编译我的 WCF 服务库后,我发现在生成代理时所有内容都已适当地序列化/反序列化。

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

我希望我的问题来源的识别将在未来对其他人有所帮助。

【讨论】:

  • 希望微软的人能对此说点什么。它占用了很多人的时间。
  • 有什么好办法弄清楚它不知道如何序列化?
  • 不幸的是,我目前知道如何确定序列化给定类型的能力的唯一方法是使用 svcutil 并查看生成的代理 - 然后是消除过程类型,直到我删除一个导致输出代理看起来像它应该的方式。如果我需要一个给定的类型并且 svcutil 在我使用它时吐出垃圾 - 我只需编写我自己的可序列化类型和我需要的功能。
  • 你有没有找到调试/诊断 svcutil 的方法?
  • 我觉得我被困在同一个地方,但我不知道要更改/注释什么,因为我的 ServiceContract 中没有这样的代码块......但我正在被我的列表变成 ArrayOfGibberish[] 废话折磨!亲爱的上帝,请帮助...
猜你喜欢
  • 1970-01-01
  • 2011-02-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-25
  • 2014-08-13
  • 2021-10-04
  • 1970-01-01
相关资源
最近更新 更多