Может ли служба WCF передавать информацию о типе (клиент не знает этот тип)? - PullRequest
0 голосов
/ 03 декабря 2010

Я работаю над простой структурой плагинов.Клиенту WCF необходимо создать экземпляр ISubject, а затем отправить обратно на сторону обслуживания.«ISubject» может быть расширен пользователем.Единственное, что клиент знает во время выполнения, это идентификатор подкласса ISubject.

Во-первых, клиенту необходимо получить информацию о типе определенного подкласса 'ISubject'.Во-вторых, клиент использует отражение для перечисления всех членов, чтобы создать редактор пользовательских свойств, чтобы каждому члену можно было присвоить правильное значение.Наконец, клиент создает экземпляр этого подкласса и отправляет обратно в службу.

Проблема заключается в том, как клиент получает информацию о типе посредством связи WCF?

Я не хочу, чтобы клиент загружал этосборка, в которой существует подкласс ('ISubject').

Спасибо

Ответы [ 4 ]

3 голосов
/ 03 декабря 2010

Во-первых, вы должны знать, что нет никакого волшебного способа, которым WCF будет предоставлять информацию любого типа вашему клиенту в сценарии, который вы описали.Если вы собираетесь это сделать, вам придется предоставить механизм самостоятельно.

Далее следует понимать, что WCF на самом деле не передает объекты с сервера на клиент или наоборот.Все, что проходит, - это XML-инфо-наборы.Часто передаваемый информационный набор XML включает в себя сериализованное представление некоторого объекта, существовавшего на стороне отправителя;в этом случае, если клиент знает об этом типе (то есть может загрузить метаданные типа из его сборки), он может десериализовать XML, чтобы создать экземпляр идентичного объекта на стороне клиента.Если у клиента нет метаданных типа, он не может: это обычный случай с WCF, если только типы контрактов данных не находятся в сборках, совместно используемых реализациями сервера и клиента (как правило, не очень хорошая идея).

Способ, которым обычно используется WCF (например, если клиент реализован с использованием «Service Reference» в Visual Studio), что происходит, когда служба публикует метаданные WSDL, описывающие ее операции и схемы XML для параметров операции и возвращаемых значений,и из них генерируется набор типов для использования в реализации клиента.Это НЕ те же типы .NET, что и типы контрактов данных, используемые реализацией сервиса, но они «эквивалентны» в том смысле, что их можно сериализовать в те же XML-данные, передаваемые по сети.Обычно это генерация типов выполняется во время разработки в Visual Studio.

Для того, чтобы делать то, что вы пытаетесь сделать, то есть, по сути, для генерации этого типа во время выполнения, вам потребуется некоторый механизм, с помощью которого клиентможет получить достаточные знания о структуре XML, представляющей различные типы объектов, реализующих ISubject, чтобы он мог понимать XML, полученный от службы, и генерировать соответствующий XML, ожидаемый службой (либо работа с XML напрямую, либо десериализация /сериализовав это каким-то образом).Если вы действительно, действительно хотите это сделать, возможными способами могут быть:

  • некоторый внеполосный механизм, посредством которого клиент предварительно конфигурируется соответствующей информацией о типе, соответствующей каждому подклассу ISubject.что это может увидеть.Ссылка, представленная в ответе blindmeis, является одним из способов сделать это.

  • предоставляют отдельную операцию службы, с помощью которой клиент может преобразовать идентификатор подкласса в тип метаданных для подкласса (возможно, какXSD-схема, из которой клиент может сгенерировать подходящий сериализуемый тип .NET для обхода XML).

  • было бы также принципиально возможно, чтобы служба передавала метаданные типа в некоторыхформат в заголовках ответа, содержащего сериализованный объект.Клиент должен будет читать, интерпретировать и действовать в соответствии с информацией о типе соответствующим образом.

В любом случае это потребует больших усилий и не является стандартным способом использования WCF.,Вам придется решить, стоит ли это того.

1 голос
/ 03 декабря 2010

Я думаю, вы можете что-то упустить:)

Основная концепция веб-сервисов и WCF заключается в том, что мы можем передавать наши объекты по сети, и клиент может работать с теми же объектами, что и сервер.Кроме того, когда клиент добавляет ссылку на службу в Visual Studio, сервер отправляет клиенту все необходимые ему сведения о любых типах, которые будут передаваться по сети.

Не должно быть необходимости в отражении.

Можно многое рассказать, но я предлагаю вам начать с этого урока, который охватывает WCF DataContracts - http://www.codeproject.com/KB/WCF/WCFHostingAndConsuming.aspx

0 голосов
/ 03 декабря 2010

wcf должен знать реальный объект (не интерфейс!), Который должен быть отправлен по проводам.таким образом, вы должны удовлетворить сервер и сторону clientproxy из службы WCF, чтобы они знали типы.если вы не знаете тип объекта при создании службы WCF, вам нужно найти способ сделать это динамически.Я использую решение из здесь , чтобы получить известные типы для моей службы WCF.

[ServiceContract(SessionMode = SessionMode.Required]
[ServiceKnownType("GetServiceKnownTypes", typeof(KnownTypeHelper))]//<--!!!
public interface IWCFService
{
    [OperationContract(IsOneWay = false)]
    object DoSomething(object obj);
}

если у вас есть что-то «универсальное», подобное приведенному выше, вы должны быть уверены, что каким бы ни был ваш объект во время выполнения, служба WCF должна знать этот объект.Вы написали, что ваш клиент создал подкласс и отправил его обратно в сервис.если вы хотите это сделать, WCF (clientproxy и сервер!) должен знать реальный тип вашего подкласса.

0 голосов
/ 03 декабря 2010

Для десериализации объекта принимающая сторона должна иметь сборку, в которой определен тип.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...