2014-08-28 10 views
3

Форматировщика бросил исключение при попытке десериализации сообщений:WCF служба Исключение: Форматировщик бросило исключение при попытке десериализации сообщения

Была ошибка при попытке десериализации параметра http://tempuri.org/:GetPatientInsuranceInformationResult. Сообщение InnerException было «Ошибка в строке 1 позиция 1604. Элемент 'http://schemas.datacontract.org/2004/07/SubSonic:_currentValue' содержит данные договора 'http://schemas.datacontract.org/2004/07/System:DBNull'. Deserializer не знает ни одного типа, который соответствует этому договору . Добавьте тип, соответствующий «DBNull», в список известных типов - например, с помощью атрибута KnownTypeAttribute или , добавив его в список известных типов, переданных в DataContractSerializer. '. Пожалуйста, смотрите InnerException для получения более подробной информации

моя функция ФОС служба

public PatientInsurance GetPatientInsuranceInformation(int PatientKey) 
     { 
      PatientInsurance col = new PatientInsurance(); 
      if (PatientKey > 0) 
      { 
       Query qry = new Query(PatientInsurance.Schema.TableName).WHERE(PatientInsurance.Columns.Deleted, false).AND(PatientInsurance.Columns.PatientKey, PatientKey); 
       col.LoadAndCloseReader(qry.ExecuteReader()); 
      } 
      return col; 
     } 

класса всегда порожденных subsonic.and я написал частичный класс в бизнес-логике следующим

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Runtime.Serialization; 
using System.Text; 
using System.Threading.Tasks; 
using System.Xml.Serialization; 


namespace PatientPortal.Model.Data 
{ 
    [KnownType(typeof(System.DBNull))] 
    [XmlInclude(typeof(DBNull))] 
    [KnownType(typeof(PatientInsurance))] 
    public partial class PatientInsurance 
    { 
     public string InsuranceTypeText 
     { 
      get 
      { 
       string insuranceTypeText = ""; 
       //if (!string.IsNullOrEmpty(Convert.ToString(this.InsuranceType))) 
       //{ 
       // int InsuranceType = Convert.ToInt32(this.InsuranceType); 
       // switch (InsuranceType) 
       // { 
       //  case 1: 
       //   insuranceTypeText = "Primary Insurance"; 
       //   break; 
       //  case 2: 
       //   insuranceTypeText = "Secondary Insurance"; 
       //   break; 
       //  case 3: 
       //   insuranceTypeText = "Tertiary Insurance"; 
       //   break; 
       // } 
       //} 
       return insuranceTypeText; 
      } 
     } 

     public string PrimPolicyHolderNameDisplay 
     { 
      get 
      { 
       string primPolicyHolderNameDisplay = "display:none;"; 
       if (!string.IsNullOrEmpty(Convert.ToString(this.PrimRelationship))) 
       { 
        primPolicyHolderNameDisplay = (this.PrimRelationship == "Self") ? "display:none;" : ""; 
       } 
       return primPolicyHolderNameDisplay; 
      } 
     } 

     public string SecPolicyHolderNameDisplay 
     { 
      get 
      { 
       string secPolicyHolderNameDisplay = "display:none;"; 
       if (!string.IsNullOrEmpty(Convert.ToString(this.SecRelationship))) 
       { 
        secPolicyHolderNameDisplay = (this.SecRelationship == "Self") ? "display:none;" : ""; 
       } 
       return secPolicyHolderNameDisplay; 
      } 
     } 

     public string TerPolicyHolderNameDisplay 
     { 
      get 
      { 
       string terPolicyHolderNameDisplay = "display:none;"; 
       if (!string.IsNullOrEmpty(Convert.ToString(this.TerRelationship))) 
       { 
        terPolicyHolderNameDisplay = (this.TerRelationship == "Self") ? "display:none;" : ""; 
       } 
       return terPolicyHolderNameDisplay; 
      } 
     } 
    } 
} 

.

+1

Вся информация вам нужно решить эту проблему в сообщении исключения ... Что вам нужно от нас точно? – Bun

+0

Не могли бы вы опубликовать класс, который получает ваш веб-сервис, а также сам веб-сервис? – Nzall

+0

Hello Nate Kerkhofs! Спасибо за ответ .. :) Я обновил свой вопрос – user632299

ответ

3

Моя служба WCF была построена с использованием рамки 4.5 и мой потребляя клиент сборки с использованием фреймворка 3.5. В связи с этим Добавить Service Reference Мастер не производил атрибут класса для KnownTypes которые были объявлены с использованием

[ServiceKnownType(typeof(System.DBNull))] 

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

Эта конфигурация необходима на стороне клиента, который решил мою проблему:

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

Сообщение об ошибке в основном означает, что ваша коллекция содержит объект типа DBNull. Deserializer WCF не знает этого типа и, таким образом, выдает исключение. Если вы добавите KnownTypeAttribute в свой контракт с данными и включите DBNull в его параметры, вы будете в порядке.

Вроде как это:

[CollectionDataContract] 
[KnownType(typeof(DBNull))] 
public class YourList : ArrayList { 
} 
+0

спасибо Farawin за ответ! Я очень новичок в wcf service.as по вашему предложению, я добавил [CollectionDataContract] [KnownType (typeof (PatientInsurance))], этот атрибут выше моего класса. Но дает мне ошибку как «Тип» PatientPortal.Model.Data.PatientInsurance 'с атрибутом CollectionDataContractAttribute является недопустимым типом коллекции, поскольку он имеет атрибут DataContractAttribute.' и еще один вопрос: что такое Player'in [KnownType (typeof (Player))] attribute.is это свойство? если да, мне нужно добавить один и тот же атрибут для нескольких других столбцов? – user632299

+0

Класс игрока - всего лишь пример, я отредактировал ответ для ясности. Я считаю, что известные типы должны быть только DataContracts. Это поможет, если вы разместите больше своего кода. – Farawin

+0

Привет, Фаравин, я обновил свой вопрос – user632299