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>
Надеюсь, это будет полезно для кого-то.