Служба Silverlight WCF, использующая унаследованные типы в контракте данных

Я пытаюсь использовать службу WCF в Silverlight ...

Я создал две отдельные сборки для своих контрактов данных ...

  1. Сборка, содержащая все мои типы, отмеченные контрактами данных, построенными для .Net 3.5

  2. Сборка Silverlight, которая ссылается на файлы в 1-й сборке.

Это означает, что мое приложение .Net может ссылаться на сборку 1 и мою сборку приложения Silverlight 2. Это работает нормально, и я могу общаться через службу.

Проблемы возникают, когда я пытаюсь передать унаследованный класс. У меня следующая структура класса ...

IFlight - интерфейс для всех типов полетов.

BaseFlight: IFlight - базовый полет реализует IFlight

AdhocFlight: BaseFlight, IFlight - специальный полет наследуется от baseflight, а также реализует IFlight.

Могу успешно переносить базовые рейсы через сервис. Однако мне действительно нужно иметь возможность передавать объекты IFlight через интерфейс, поскольку мне нужен один контракт операции, который может передавать многие типы полета ...

public IFlight GetFlightBooking()
{
    AdhocFlight af = new AdhocFlight();
    return af;
}

... я думаю, должно работать?

Однако я получаю сообщение об ошибке:

«Сервер не предоставил значимого ответа; это могло быть вызвано несоответствием контракта, преждевременным завершением сеанса или внутренней ошибкой сервера».

Любые идеи были бы хорошы.


person Remotec    schedule 24.01.2010    source источник
comment
Есть ли причина, по которой вы вручную создаете сборку Silverlight с соответствующими типами вместо использования slsvcutil.exe или функции добавления ссылки на службу, которая автоматически сгенерирует для вас все типы?   -  person Dan Auclair    schedule 24.01.2010


Ответы (3)


Я думаю, что то, что вы хотите делать, возможно в «нормальном» .NET WCF. Вот вопрос, который касается передачи интерфейсов в службе WCF:
Передача интерфейса в служба WCF?

Но я очень сомневаюсь, что это будет работать в Silverlight. Поддержка WCF в SL, мягко говоря, отрывочна. Но я не пробовал. Я могу быть не прав.

person Henrik Söderlund    schedule 24.01.2010
comment
Привет, я рад сообщить, что это действительно работает :) Я присвоил свой сервис следующим образом: [ServiceKnownType (typeof (Flight))] [ServiceKnownType (typeof (FlightLiveOps))] [ServiceKnownType (typeof (FlightScheduled))] [AspNetCompatibilityRequirements (RequirementsMode = AspNetCompatibilityRequirementsMode.Allowed)] открытый класс DispatchService - person Remotec; 29.01.2010

Вы говорите, что BaseFlight работает; называет ли ваш базовый класс известные типы?

[DataContract]
[KnownType(typeof(AdhocFlight))]
class BaseFlight : IFlight {...}

Вы также можете посмотреть [ServiceKnownType]. В общем WCF не понравится подход, основанный на интерфейсе (IFlight), поскольку он захочет точно знать, чего ожидать от данных, которые он (де) сериализует; Я ожидал, что он будет нормально работать с вышеуказанным и с использованием BaseFlight в API.

person Marc Gravell    schedule 24.01.2010
comment
[ServiceKnownType] был ключом - я добавил его в контракт на обслуживание. - person Remotec; 29.01.2010

Это может быть связано, а может и не быть связано с ошибкой сериализации универсальных типов интерфейса в WCF, зарегистрированной здесь.

http://connect.microsoft.com/VisualStudio/feedback/details/391260/executionengineexception-thrown-from-datacontractserializer-with-ilist-t

Если это связано с вашей проблемой, вы будете рады узнать, что она исправлена ​​в .net 4.0.

person Ciaran O'Neill    schedule 21.04.2010