4

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

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

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

  1. WCF 服务返回数组而不是列表
  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<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>

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

Dictionary<'int, string'> 返回为 ArrayOfKeyValueOfintstringKeyValueOfintstring[]

和:

List<'T'> 返回为 T[]

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

更新:

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

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

但是,当我返回KeyValuePair<int, string>[]. 我的代理正在生成KeyValuePairOfintstring[].

解决办法贴在下面。

4

1 回答 1

4

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

在我的ServiceContract我有以下内容:

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

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

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

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

于 2013-05-21T15:28:33.800 回答