2014-08-28 3 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 '데이터 계약의 데이터가 포함되어 있습니다. 디시리얼라이저에는 계약서에 매핑되는 유형에 대한 정보가 없습니다. 'DBNull'에 해당하는 유형을 알려진 유형 목록에 추가하십시오. 예를 들어 KnownTypeAttribute 속성을 사용하거나 DataContractSerializer로 전달 된 알려진 유형 목록에 추가하십시오. '.

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; 
      } 
     } 
    } 
} 

을 다음과 같이 내가 비즈니스 로직에 부분 클래스를 작성했습니다 항상 subsonic.and에 의해 생성 된 자세한 내용

내 WCF 서비스 기능

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; 
     } 

클래스의 InnerException를 참조하십시오.

+1

모든 정보를 ... 당신은 정확히 우리가 무엇을해야합니까? – Bun

+0

웹 서비스가받는 클래스는 물론 웹 서비스 자체를 게시 할 수 있습니까? – Nzall

+0

Hello Nate Kerkhofs! 답장을 보내 주셔서 감사합니다. :) 내 질문을 업데이트했습니다. – user632299

답변

3

내 WCF 서비스 내 사용자 클라이언트 빌드 프레임 워크 3.5 빌드 프레임 워크 4.5을 사용하여 사용 하였다. 이 때문에 서비스 참조 마법사 클래스

[ServiceKnownType(typeof(System.DBNull))] 

직렬화 복원 때, 클라이언트가 점점되지 System.DBNull 유형을 사용하여 선언 된 KnownTypes에 대한 속성 생성되지 않은 추가합니다. 우리는 클라이언트 설정 파일에 knowntypes를 추가해야합니다.

내 문제를 해결 클라이언트 측에서 필요한이 구성 :이 문제는 예외 메시지에 해결해야 할

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

오류 메시지는 기본적으로 컬렉션에 DBNull 유형의 개체가 있음을 의미합니다. WCF 디시리얼라이저는 해당 형식에 대한 지식이 없으므로 예외를 throw합니다. 데이터 계약에 KnownTypeAttribute를 추가하고 매개 변수에 DBNull을 포함하면 잘됩니다. 이 같은의

정렬 :

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

감사합니다. Farawin for Reply! 나는 wcf service.as 귀하의 제안에 매우 새로운, [CollectionDataContract] [KnownType (typeof (PatientInsurance))]이 class.but 위의 특성을 추가했습니다 'Type'PatientPortal.Model.Data.PatientInsurance 'CollectionDataContractAttribute 특성을 가진 컬렉션 형식이 DataContractAttribute 특성을 갖기 때문에 잘못된 컬렉션 형식입니다.'Player'in [KnownType (typeof (Player))] 속성이 무엇입니까? 다른 모든 열에 대해 여러 번 동일한 속성이 있습니까? – user632299

+0

Player 클래스는 예제 일 뿐이므로 명확하게 답변을 편집했습니다. 나는 Known Types가 DataContracts 일 필요가 있다고 믿습니다. 더 많은 코드를 게시하면 도움이됩니다. – Farawin

+0

안녕하세요 파라 윈, 내 질문을 업데이트했습니다. – user632299

관련 문제