3

我在我的 WCF 界面中使用 HashSet

[ServiceContract]
public interface IwcfServerSync
{
    [OperationContract]
    void Test(HashSet<int> someHashSet);
}

当我创建一个服务引用时,HashSet 变成了一个 int[]。

我添加了一个 ServiceKnownType :

[ServiceKnownType(typeof(System.Collections.Generic.HashSet<int>))]

并尝试了一些配置,但无法完全改变。

如果我更改它硬编码一切正常,但每次更新我的参考时更改它真的很烦人..

我可能做错了什么,有什么指示或想法吗?

4

1 回答 1

4

当它们通过网络时,集合被简化了。您可以通过 IDE 和命令行 ( svcutil /collectionType) 指定集合类型,但它将应用于API 上的所有集合。我认为你应该接受它,并通过代码处理不匹配。最终,在网络上,集合只是 xml(至少在标准绑定上) - 类似于:

<items>
   <item ...>...</item>
   <item ...>...</item>
   <item ...>...</item>
</items>

- 因此为什么它不能(从模式中)分辨数组(T[])、a List<T>、aHashSet<T>和 a之间MyFunkyCollection<T>

请注意,如果您使用程序集共享(即相同的服务合同程序集在客户端服务器上),则不会发生这种情况——但这违背了 SOA/mex 的意图。但它是一种经常使用的方法 - 因此 IDE 直接支持它,并通过开关 ( svcutil /reference) 支持命令行。


对于支持它的IDE...如果您在类库(dll)中编写服务契约和数据契约,然后从两个项目(服务器项目和客户端项目)。现在将客户端项目中的服务引用添加到服务器端点(.svc)。如果您使用的是 VS2008,它将自动检查类型的本地引用并使用它们代替代理生成 - 意思是:您的客户端代码使用IwcfServerSync来自类库的类库,它已经知道是否使用HashSet<T>等。

于 2009-05-10T09:24:18.563 回答