处理集合在具有共享 WCF 接口的客户端上

发布于 2024-12-09 12:26:17 字数 418 浏览 0 评论 0原文

我们一直在使用 Microsoft Sync Framework 和 WCF 开发中心/辐射同步模型,并且由于我们同时开发客户端和服务器,因此我们希望将 WCF 服务契约接口放入共享程序集中,以便我们可以定义它一次并在客户端和服务器之间共享。在大多数情况下,这是可行的,但 Sync Framework 的 GetSchema 方法会传递一个表名称的 Collection 对象,该对象会被序列化并在客户端上作为 string[] 读取。但是,由于客户端代理已编写为使用服务器接口,因此它期望接收 Collection 对象,但我遇到了类型不匹配的问题。

我只是将合同更改为仅显式传递 string[],并在调用同步提供程序方法时手动转换它,但这会导致“发现不明确的匹配”错误。

如何在客户端和服务器上使用相同的接口并处理 Collection -> string[] 序列化正确吗?

We have been developing a hub/spoke synchronization model using Microsoft Sync Framework and WCF, and since we are developing both the client and the server, we would like to put the WCF service contract interface into a shared assembly so that we can define it just once and share it between the client and server. For the most part this works, but the GetSchema method of Sync Framework passes a Collection object of table names which gets serialized and read on the client as string[]. However, since the client proxy has been written to use the server interface it is expecting to receive a Collection object and I am getting a type mismatch.

I would just change the contract to explicitly pass only string[], and manually cast it when calling the sync provider methods, but this leads to an "ambiguous match found" error.

How can I use the same interface on both the client and server and handle the Collection -> string[] serialization correctly?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

请叫√我孤独 2024-12-16 12:26:17

我通过在传入代理的 Collection 上使用 ToArray() LINQ 扩展调用解决了这个问题:服务器

public override SyncSchema GetSchema(System.Collections.ObjectModel.Collection<string> tableNames, SyncSession syncSession)
{
    return this.ServiceProxy.GetSchema(tableNames.ToArray(), syncSession);
}

上的合约指定了一个 IEnumerable 而不是 Collection

public SyncSchema GetSchema(IEnumerable<string> tableNames, SyncSession syncSession)
{
    // Convert IEnumerable<string> to Collection<string>
    Collection<string> tables = new Collection<string>(tableNames.ToList());
    return this.syncProvider.GetSchema(tables, syncSession);
}

I solved this by using the ToArray() LINQ extension call on the Collection<string> that is passed in to the proxy:

public override SyncSchema GetSchema(System.Collections.ObjectModel.Collection<string> tableNames, SyncSession syncSession)
{
    return this.ServiceProxy.GetSchema(tableNames.ToArray(), syncSession);
}

The contract on the server specified an IEnumerable<string> instead of a Collection<string>.

public SyncSchema GetSchema(IEnumerable<string> tableNames, SyncSession syncSession)
{
    // Convert IEnumerable<string> to Collection<string>
    Collection<string> tables = new Collection<string>(tableNames.ToList());
    return this.syncProvider.GetSchema(tables, syncSession);
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文