Обработка коллекции <string>на клиенте с общим интерфейсом WCF - PullRequest
0 голосов
/ 11 октября 2011

Мы разрабатываем модель синхронизации концентратор / спица с использованием Microsoft Sync Framework и WCF, и, поскольку мы разрабатываем и клиент, и сервер, мы хотели бы поместить интерфейс контракта службы WCF в общую сборку, чтобы мы могли определите его только один раз и поделитесь им между клиентом и сервером. По большей части это работает, но метод GetSchema Sync Framework передает объект Collection с именами таблиц, который сериализуется и читается на клиенте как строка []. Однако, поскольку клиентский прокси-сервер был написан для использования интерфейса сервера, он ожидает получить объект Collection, и я получаю несоответствие типов.

Я бы просто изменил контракт так, чтобы он явно передавал только строку [], и приводил его вручную при вызове методов поставщика синхронизации, но это приводит к ошибке "найдено неоднозначное совпадение".

Как я могу использовать один и тот же интерфейс на клиенте и на сервере и правильно обрабатывать сериализацию Collection -> string []?

1 Ответ

1 голос
/ 09 ноября 2011

Я решил эту проблему с помощью вызова расширения ToArray() LINQ на Collection<string>, передаваемого прокси:

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

В контракте на сервере указано IEnumerable<string> вместо 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);
}
...