WCF и Дозвуковые Классы - у десериализатора нет знаний любого типа, который соответствует этому контракту

У меня следующая ошибка для моего клиента WCF:

"Error in line 1 position 1910. Element 'http://schemas.datacontract.org/2004/07/SubSonic:_currentValue' contains data of the 'http://schemas.datacontract.org/2004/07/System:DBNull' data contract. The deserializer has no knowledge of any type that maps to this contract. Add the type corresponding to 'DBNull' to the list of known types - for example, by using the KnownTypeAttribute attribute or by adding it to the list of known types passed to DataContractSerializer."

Я использую Subsonic 2.0 для создания объектов моего класса.

Я также украсил свой класс и членов, используя DataContract а также DataMember,

Попробовал добавить [KnownType(typeof(System.DBNull))] в мой сгенерированный класс.

Попробовал добавить [ServiceKnownType(typeof(System.DBNull))] на мой сервисный интерфейс.

Мой сгенерированный класс выглядит так: (Этот класс создан для SQL View)

/// <summary>
    /// This is  Read-only wrapper class for the  view.
    /// </summary>
    [Serializable]    
    [KnownType(typeof(System.DBNull))]
    [DataContract]
    public partial class VwPatientRt : ReadOnlyRecord<VwPatientRt> 
    { ... ...

Сервисный интерфейс:

 [ServiceContract]    
    [ServiceKnownType(typeof(System.DBNull))]    
    public interface IPatientService
    {
        [WebInvoke(Method = "GET", UriTemplate = "GetPatientAppointments")]
        [OperationContract]
        IList<VwPatientRt> GetPatientAppointments();
     ..... 

Класс обслуживания:

public class PatientService : IPatientService
{ 
    public IList<VwPatientRt> GetPatientAppointments()
    {
       ... .
       .....
    }
   ... 

На стороне клиента все выглядит нормально. Потому что для других методов и классов это работает нормально.

При просмотре с подробным исключением DBNull и _currentValue используются в классе Subsonic TableColumnSetting.

Что я должен делать?

Также гуглил и просматривал подобные посты, но никто не помог мне и боролся с почти 2 днями на этом.

Любая помощь или предложение с фрагментом кода приветствуется.

: Решено:

Мой сервис WCF был собран с использованием фреймворка 4.5, а мой потребительский клиент был собран с использованием фреймворка 3.5. Из-за этого мастер Add Service Reference не генерировал атрибут Class для KnownTypes, которые были объявлены с использованием

[ServiceKnownType(typeof(System.DBNull))] 

Итак, при десериализации клиент не получал тип System.DBNull. Мы должны добавить knowntypes в файл конфигурации клиентов.

Эта конфигурация нужна на стороне клиента, что решило мою проблему:

<system.runtime.serialization>
        <dataContractSerializer>    
            <declaredTypes>
                <add type="NameSpace.ServiceClientName.ClassNameForWhichKnownTypeIsToBeGiven, AssemblyName">
                    <knownType  type="System.DBNull"></knownType>
                </add>
             </declaredTypes>
        </dataContractSerializer>
</system.runtime.serialization> 

Надеюсь, это будет полезно для кого-то.

0 ответов

Другие вопросы по тегам