Подтвердить что ты не робот

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

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

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

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

но это не так:

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

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

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

4b9b3361

Ответ 1

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

[ServiceKnownType(typeof(ConcreteDeviceType)]

Ответ 2

Спасибо, он работает, когда я менял его следующим образом:

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

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

Ответ 3

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

[DataContract]
[KnownType(typeof(LoadTypeData))]
[KnownType(typeof(PlanReviewStatusData))]
public abstract class RefEntityData : EntityData, IRefEntityData