Передача интерфейса в службу WCF? - PullRequest
19 голосов
/ 21 ноября 2008

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

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

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

но это не так:

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

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

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

Ответы [ 3 ]

20 голосов
/ 21 ноября 2008

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

[ServiceKnownType(typeof(ConcreteDeviceType)]
9 голосов
/ 22 ноября 2008

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

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

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

1 голос
/ 03 апреля 2012

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

[DataContract]
[KnownType(typeof(LoadTypeData))]
[KnownType(typeof(PlanReviewStatusData))]
public abstract class RefEntityData : EntityData, IRefEntityData
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...