2008-11-21 3 views
19

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

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

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

, но это не делает:

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

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

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

ответ

20

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

[ServiceKnownType(typeof(ConcreteDeviceType)] 
+1

Извините, но я не думаю, что понимаю. Предположим, я хочу, чтобы метод GetInterface возвращал два разных класса: SimpleDevice и AdvancedDevice, оба из которых реализуют интерфейс IDevice. Должен ли я установить ServiceKnownType для обоих типов? – 2008-11-21 21:13:28

+1

При десериализации, как WCF знает, какой тип реализации IHomeService использовать? – Will 2008-11-21 21:15:12

9

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

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

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

1

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

[DataContract] 
[KnownType(typeof(LoadTypeData))] 
[KnownType(typeof(PlanReviewStatusData))] 
public abstract class RefEntityData : EntityData, IRefEntityData 
Смежные вопросы