c# - 创建服务引用时 WCF HashSet 更改为 int[]

标签 c# wcf hashset proxy-classes service-reference

我正在使用 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/

相关文章:

c# - 如何在 C# 中使用 PHP CLI

java - HashSet 输出不匹配 [JAVA]

android - 从字符串中删除无效的数字字符

c# - 拦截IQueryable Provider的 'Expression'属性并获取其e-sql

带有通配符的java黑名单

c# - Silverlight DataGrid 中列的不同默认排序顺序

C# 如何在 web 服务中返回我的基类

c# - 在ASP.NET中,使用什么来管理角色和分配给角色的权限?

c# - 我应该为 WPF 应用程序创建什么样的 WCF 服务?/域服务

c# - 将从 Android 应用程序发送的用户名和密码读入我的 WCF REST 服务?