我在WCF界面中使用HashSet
[ServiceContract]
public interface IwcfServerSync
{
[OperationContract]
void Test(HashSet<int> someHashSet);
}
当我创建服务引用时,HashSet变成int []。
我添加了ServiceKnownType:
[ServiceKnownType(typeof(System.Collections.Generic.HashSet<int>))]
并尝试了一些配置,但无法完全改变它。
如果我改变它硬编码一切正常,但每次更新我的参考时更改它真的很烦人。
我可能做错了什么,有什么指示或想法吗?
答案 0 :(得分:4)
收集过程简化了收集。您可以通过IDE和命令行(svcutil /collectionType
)指定集合类型,但它将应用于API上的所有集合。我认为你应该接受它,并通过代码处理不匹配。最后,在线上,集合只是xml(至少在标准绑定上) - 类似于:
<items>
<item ...>...</item>
<item ...>...</item>
<item ...>...</item>
</items>
- 因此它无法告诉(来自架构)数组(T[]
),List<T>
,HashSet<T>
和MyFunkyCollection<T>
。< / p>
请注意,如果您使用程序集共享(即同一服务协定程序集位于客户端和服务器),那么这不会发生 - 但这会破坏SOA / mex的意图。但是使用的方法是相当多的 - 因此IDE直接支持它,并通过开关(svcutil /reference
)支持命令行。
对于支持它的IDE ...如果你在类库(dll)中编写服务契约和数据契约,然后从这两个库中添加一个程序集引用(即dll引用或项目引用)到这个库项目(服务器项目和客户端项目)。现在,将服务引用从客户端项目添加到服务器端点(.svc)。如果您使用的是VS2008,它将自动检查类型的本地引用并使用它们代替代理生成 - 这意味着:您的客户端代码使用类库中的IwcfServerSync
,类库已经知道是否使用{{1}等等。