Передача интерфейса в службе WCF?

Я экспериментирую со службами WCF и столкнулся с проблемой передачи интерфейсов.

Это работает:

[ServiceContract]
public interface IHomeService
{
    [OperationContract]
    string GetString();
}

но это не так:

[ServiceContract]
public interface IHomeService
{
    [OperationContract]
    IDevice GetInterface();
}

Когда я пытаюсь скомпилировать клиента, метод GetInterface терпит неудачу. Я получаю Exception о том, что он не может преобразовать Object в IDevice.

На стороне клиента класс IHomeService правильно реализует GetString со строкой в ​​качестве возвращаемого типа, но GetInterface имеет возвращаемый тип объекта. Почему это не IDevice?


person Frode Lillerud    schedule 21.11.2008    source источник


Ответы (3)


Вам нужно указать сериализатору WCF, какой класс использовать для сериализации интерфейса.

[ServiceKnownType(typeof(ConcreteDeviceType)]
person Brian Genisio    schedule 21.11.2008
comment
Мне очень жаль, но я не думаю, что понимаю. Скажем, я хочу, чтобы метод GetInterface возвращал два разных класса, SimpleDevice и AdvancedDevice, которые реализуют интерфейс IDevice. Должен ли я затем установить ServiceKnownType для обоих типов? - person Frode Lillerud; 22.11.2008
comment
Как при десериализации WCF узнает, какой тип реализации IHomeService использовать? - person ; 22.11.2008
comment
Да, я думаю, ты понял. Вы сообщаете WCF возможные типы, реализующие интерфейс. Вы можете передать любой тип, если WCF знает, что эти известные типы реализуют интерфейс и являются сериализуемыми. - person Brian Genisio; 22.11.2008

Спасибо, работает, когда поменял вот так:

[ServiceContract]
[ServiceKnownType(typeof(PhotoCamera))]
[ServiceKnownType(typeof(TemperatureSensor))]
[ServiceKnownType(typeof(DeviceBase))]
public interface IHomeService
{
    [OperationContract]
    IDevice GetInterface();
}

Я также получил помощь с этого сайта: http://www.Thistshapes.com/WCF/UsingInterfacesAsParameters.htm

person Frode Lillerud    schedule 21.11.2008
comment
Ссылка сейчас 404, но некоторые поисковые системы кешируют ее - person noonand; 07.03.2012
comment
Фроде: Вам не кажется, что @Brian действительно ответил на ваш вопрос? - person M. Mimpen; 07.05.2014

Сначала я попытался передать интерфейс методу WCF, но не смог заставить код работать, используя ответы, предоставленные в этом потоке. В конце концов, я реорганизовал свой код и передал абстрактный класс методу, а не интерфейсу. Я заставил это работать, используя атрибут KnownType в базовом классе, например.

[DataContract]
[KnownType(typeof(LoadTypeData))]
[KnownType(typeof(PlanReviewStatusData))]
public abstract class RefEntityData : EntityData, IRefEntityData
person Myles J    schedule 03.04.2012