Две службы WCF возвращают один и тот же контракт данных клиенту Silverlight

У меня есть две службы WCF, которые логически различны, и я хочу, чтобы они были разделены. У каждого из них есть операция, которая возвращает один и тот же контракт данных. Один клиент Silverlight использует обе службы. Когда я добавляю ссылку на службу в клиенте silverlight к каждой службе, единственный контракт данных дважды появляется в сгенерированном коде. Возможно ли, чтобы обе ссылки на службы использовали одно и то же определение контракта данных?

Из того, что я читал, для клиентов, отличных от Silverlight, это возможно путем компиляции контрактов данных в отдельную сборку, на которую ссылаются как сервер, так и клиент. Однако это невозможно с серебристым светом (по крайней мере, с серебристым светом 3).

Спасибо,
Роб


person Robert Graves    schedule 18.02.2010    source источник


Ответы (3)


Вы пробовали создавать клиентов с помощью svcutil. ЕСЛИ вы даете несколько конечных точек службы, все работает нормально, но дает массу ошибок, генерирующих клиентов.

person rerun    schedule 26.02.2010

Стиан,

Спасибо за быстрый ответ. Я смотрел скринкаст Мигеля Кастро, он был очень информативным. К сожалению, это не касается ситуации с серебристым светом. Однако, используя это в качестве отправной точки, я смог получить что-то работающее, что другие могут найти полезным.

Создайте две сборки: ServerDataContracts и SilverlightDataContracts (на этот раз как сборку silverlight). В каждом AssemblyInfo.cs добавьте следующую строку:

[assembly: ContractNamespace("http://YourNamespaceUri",
 ClrNamespace = "YourDataContractsNamespace")]

Добавьте все свои DataContracts в сборку ServerDataContracts. В сборке SilverlightDataContracts щелкните правой кнопкой мыши проект (или подпапку) и выберите «Добавить существующий элемент». Перейдите к DataContracts в сборке ServerDataContracts и выберите те, которые хотите добавить. НЕ НАПАДАЙТЕ "ДОБАВИТЬ" !!! Вместо этого нажмите стрелку вниз рядом с «Добавить» и выберите «Добавить как ссылку». Это связывает проект SilverlightDataContracts с существующими файлами в проекте ServerDataContracts. Теперь, когда вы редактируете один, оба проекта получают изменения. Когда вы компилируете, проекты компилируются отдельно со своими правильными целями.

Теперь добавьте сборку ServerDataContracts в качестве ссылки на проект контракта на обслуживание. Сделайте то же самое для сборки SilverlightDataContracts в приложении Silverlight. Когда вы добавляете ссылку на службу из клиента Silverlight в свою службу, она не должна создавать контракты данных. Вместо этого он должен использовать те, что из вашей сборки.

Я получил эту работу, однако по-прежнему отсутствуют некоторые функции, предоставляемые сгенерированными классами контрактов данных. Сгенерированные классы реализуют INotifyPropertyChanged, что чрезвычайно полезно при привязке данных в silverlight / wpf. Хотя вы можете реализовать это самостоятельно, это довольно утомительно, и теперь ваш серверный код должен выполнять все эти обработчики событий для каждого набора свойств, даже если вы, вероятно, никогда не подпишетесь на событие PropertyChanged на сервере.

Я все еще ищу более чистый способ справиться с этим. Похоже, Silverlight 4 упростит это, поскольку вы можете использовать одну и ту же сборку как на клиенте, так и на сервере (скомпилированный код совместим). К сожалению, это слишком далеко для моих нужд.

person Robert Graves    schedule 18.02.2010
comment
Это действительно нужно было добавить к вашему вопросу в качестве дополнительной информации. - person ChrisF; 19.02.2010

Это раздражает, но это сработало. У меня есть одна основная услуга и несколько вспомогательных. Основная служба - это то, к чему принадлежат все контракты данных, а вспомогательные службы должны повторно использовать контракты данных, указанные в основной службе.

Я создал сборку silverlight, чтобы действовать исключительно как клиент основной службы. Затем на него ссылалось мое приложение Silverlight. Затем в приложении Silverlight я добавил свои вспомогательные службы. При добавлении вспомогательной службы расширенный экран позволяет указать, следует ли повторно использовать типы в ссылочных сборках. По умолчанию он включен. Поскольку основная служба указана в сборке, на которую указывает ссылка, все вспомогательные службы используют контракты данных из основной службы.

Это некрасиво, но работает.

person Robert Graves    schedule 18.02.2010
comment
Вы должны либо отредактировать свой вопрос, добавив больше информации, либо просто опубликовать единственный ответ. Stack Overflow - это не традиционный форум, это сайт вопросов и ответов, поэтому у вас нет разговоров, как на форуме. - person ChrisF; 19.02.2010