Неправильный пользователь наследования в сервисе wcf - PullRequest
1 голос
/ 17 ноября 2011

Я получаю ошибку в результате

<ServiceKnownType(GetType(EmailMessageTemplate))> _
<ServiceKnownType(GetType(SmsMessageTemplate))> _
  <OperationContract()> <WebMethod()> _
    Public Function GetMessageTemplates(ByVal handlerId As Integer) As Collection(Of MessageTemplate)
        Dim result = New Collection(Of MessageTemplate)

        result = MessageDataAccess.GetMessageTemplates(handlerId)

        Return result
    End Function

, который я веб-метод wcf службы (потому что я использую:

<%@ServiceHost Language="VB" Service="MyAppITWS.Service1" %>

и я ссылаюсь на свое приложение в качестве службы ссылки

результат - коллекция EmailMessageTemplates и SmsMessageTemplates. Вот мои dtacontracts:

[DataContract]
public class EmailMessageTemplate : MessageTemplate
{
        [DataMember]
        public string EmailSubject { get; set; }
        [DataMember]
        public EmailFormat EmailFormat { get; set; }
}

[DataContract]
public class EmailMessageTemplate : MessageTemplate
{
    [DataMember]
    public string EmailSubject { get; set; }
    [DataMember]
    public EmailFormat EmailFormat { get; set; }
}

[DataContract]
public class SmsMessageTemplate : MessageTemplate
{
}

Как это исправить?

Вот довольно красивая ошибка:

{System.Runtime.Serialization.SerializationException: Ошибка в строке 1, позиция 1535. Элемент 'http://schemas.datacontract.org/2004/07/MyAppUtils.DataModel.Messaging:MessageTemplate' содержит данные контракта данных' http://schemas.datacontract.org/2004/07/MyAppUtils.DataModel.Messaging:EmailMessageTemplate'. Десериализатор не знает ни о каком типекоторый сопоставляется с этим контрактом. Добавьте тип, соответствующий «EmailMessageTemplate», в список известных типов - например, с помощью атрибута KnownTypeAttribute или добавив его в список известных типов, передаваемых в DataContractSerializer. w System.Runtime.Serialization.XmlObjectSerializerReadContext.InternalDeserialize (читатель XmlReaderDelegator, имя строки, строка ns, DataContract и dataContract) w System.Runtime.Serialization.XmlObjectSerializerReadContext.InternalDeserialize (XmlReaderDelegator XMLReader, Int32 идентификатор, RuntimeTypeHandle declaredTypeHandle, имя String, String нс) ш ReadArrayOfMessageTemplateFromXml (XmlReaderDelegator, XmlObjectSerializerReadContext, XmlDictionaryString, XmlDictionaryString, CollectionDataContract) ш System.Runtime.Serialization.CollectionDataContract.ReadXmlValue (XmlReaderDelegator XMLReader, XmlObjectSerializerReadContext контекст) шSystem.Runtime.Serialization.XmlObjectSerializerReadContext.ReadDataContractValue (DataContract dataContract, читатель XmlReaderDelegator) w System.Runtime.Serialization.XmlObjectSerializerReadContext.InternalDeserialize.XmlReaderDelegator xmlReader, Тип объявленного типа, DataContract dataContract, Имя строки, Строка ns) w System.Runtime.Serialization.DataContractSerializer.InternalReadObject (XmlReaderDelegatorxmlReader, Boolean verifyObjectName) w System.Runtime.Serialization.XmlObjectSerializer.ReadObjectHandleExceptions (читатель XmlReaderDelegator, Boolean verifyObjectName) w System.Runtime.Serialization.DataContractSerializer.ReadObjectSourcePlaySourcePlaySourceRameServiceReaderSourceServiceReaderReaderSourceServiceReaderReaderSourceService_Reader_Reader_nameЧитатель XmlDictionaryReader, часть PartInfo, логическое isRequest)}

Ответы [ 2 ]

2 голосов
/ 17 ноября 2011

KnownType обычно применяется к базовому типу - т.е.

[DataContract, KnownType(typeof(MessageTemplate)), ...] 

(вы также можете указать известные типы в конструкторе DataContractSerializer, не требуя атрибутов)

ЕслиКаркасный класс не знает обо всех производных типах, поэтому вам нужно указать известные типы при создании сериализатора:

синтаксис:

[KnownType(typeof(SubClass))] 
public class BaseClass 
2 голосов
/ 17 ноября 2011

Вы прочитали первую строку сообщения об ошибке?

Десериализатор не знает ни одного типа, который сопоставляется с этим контрактом. Добавьте тип, соответствующий «EmailMessageTemplate», в список известных типов, например, с помощью атрибута KnownTypeAttribute или добавив его в список известных типов, передаваемых в DataContractSerializer.

то есть, добавьте следующий атрибут к вашему MessageTemplate классу

[DataContract]
[KnownType(typeof(EmailMessageTemplate)]
public class MessageTemplate 
{

}

см. эту ссылку для работающего примера

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...