Ответ 1
Вам нужно указать сериализатор WCF, какой класс использовать для сериализации интерфейса
[ServiceKnownType(typeof(ConcreteDeviceType)]
Я экспериментирую с услугами WCF и сталкиваюсь с проблемой с передачей интерфейсов.
Это работает:
[ServiceContract]
public interface IHomeService
{
[OperationContract]
string GetString();
}
но это не так:
[ServiceContract]
public interface IHomeService
{
[OperationContract]
IDevice GetInterface();
}
Когда я пытаюсь скомпилировать клиент, он терпит неудачу в методе GetInterface. Я получаю сообщение об исключении, которое не может преобразовать Object в IDevice.
На клиентском компьютере класс IHomeService корректно реализует GetString со строкой, как и returntype, но GetInterface имеет возвращаемый тип объекта. Почему это не IDevice?
Вам нужно указать сериализатор WCF, какой класс использовать для сериализации интерфейса
[ServiceKnownType(typeof(ConcreteDeviceType)]
Спасибо, он работает, когда я менял его следующим образом:
[ServiceContract]
[ServiceKnownType(typeof(PhotoCamera))]
[ServiceKnownType(typeof(TemperatureSensor))]
[ServiceKnownType(typeof(DeviceBase))]
public interface IHomeService
{
[OperationContract]
IDevice GetInterface();
}
Я также получил помощь с этого сайта: http://www.thoughtshapes.com/WCF/UsingInterfacesAsParameters.htm
Сначала я попытался передать интерфейс WCF-методу, но не смог заставить код работать, используя ответы, предоставленные в этом потоке. В итоге я реорганизовал свой код и передал абстрактный класс методу, а не интерфейсу. Я получил это для работы, используя атрибут KnownType в базовом классе, например.
[DataContract]
[KnownType(typeof(LoadTypeData))]
[KnownType(typeof(PlanReviewStatusData))]
public abstract class RefEntityData : EntityData, IRefEntityData