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