2011-02-03 4 views
8

IEnumerable<CyberResourceProvisioningAction>을 반환하는 WCF 서비스를 만들었습니다.WCF - DataMember로 IEnumerable <T>을 장식하면 예외가 발생합니다. 기본 연결이 닫혔습니다. 예기치 않게 연결이 닫혔습니다.

CyberResourceProvisioningAction 유형은 AccountInformation 속성이 IEnumerable<CyberResourceProvisioningActionAccountInfo>입니다.

WCF System.Net.WebException : :이 기본 연결이 닫혔습니다 : 나는 DataMemberAttribute로 AccountInformation 속성을 장식 할 때 나는 예외를받는 연결이 매우 일반적인 예외 분명히 예기치 않게

을 폐쇄되었다 하지만 Google-fu는 컬렉션에 많은 수의 객체를 반환 할 때 가장 일반적으로 발생하는 문제임을 나타냅니다. 제안 된 해결 방법은 <dataContractSerializer maxItemsInObjectGraph="2147483646"/>으로 설정하는 것입니다. 불행히도이 문제가 해결되지 않았습니다. (소량의 데이터를 반환 할 때 그렇게 생각하지 않았습니다.)

속성이 올바르게 설정되어 있으므로 내 문제가 직렬화 구성과 관련이 있다는 것을 확신 할 수 있습니다. 이런 식으로 WCF 서비스에 오류를 일으키는 클래스가 잘못 됐습니까? CyberResourceProvisioningActionAccountInfo

[DataContract] 
public class CyberResourceProvisioningActionAccountInfo 
{ 
    [DataMember] 
    public string Name { get; set; } 

    [DataMember] 
    public string Value { get; set; } 
} 

추가 구성 정보가 필요한 경우

[DataContract] 
public class CyberResourceProvisioningAction 
{ 
    [DataMember] 
    public string Action { get; set; } 

    [DataMember] 
    public DateTime RcdChgDateTime { get; set; } 

    [DataMember] 
    public string CyberResourceName { get; set; } 

    [DataMember] 
    public IEnumerable<CyberResourceProvisioningActionAccountInfo> AccountInformation 
    { get; set; } 
} 

나를 알고 내가 게시물을 수정할 것입니다 수 있습니다.

+2

도움말 페이지가 활성화되어 있으면 활성화 예외가 표시되는지 찾아보십시오. 그렇지 않으면 디버거를 연결하고 예외를 트랩합니다. DataContract 프로그래밍 모델 위반일지도 모릅니다. – alexdej

+0

@alexdej 디버거를 연결했지만 예외를 트랩하지 않습니다. 예외는 WCF 테스트 클라이언트에는 나타나지만 디버거에는 나타나지 않습니다. – ahsteele

+1

WCF 호스트 프로젝트를 직접 디버깅 해보고'Type 'System.Data.Entity.Infrastructure.DbQuery1 [MYCLASS]'오류를 직렬화 할 수없는 다음 서비스에서받은 'WcfTestClient' –

답변

14

alexdej에 의해 남겨진 "DataContract 프로그래밍 모델 위반"에 대한 의견 때문에 내 속성에 있던 내용을 조금 더 자세히 살펴보기 시작했습니다. 나는 속성에 Linq 형식을 가지고 있었지만 IEnumerable이지만 직렬화에 대해 열거되지 않았습니다. .ToList()이 추가되었으며 모두 정상입니다.

+1

서비스로 테스트하십시오. DataContractAttribute 특성으로 표시하고 DataMemberAttribute 특성을 사용하여 직렬화 할 모든 구성원을 표시하는 것이 좋습니다. 형식이 컬렉션 인 경우 컬렉션에 CollectionDataContractAttribute를 표시하는 것이 좋습니다. 다른 지원되는 유형은 Microsoft .NET Framework 설명서를 참조하십시오. return 문 앞에'.ToList()'를 추가하면 문제가 해결됩니다. 감사! – MaciejLisCK

+0

@MaciejLisCK 이것이 당신에게 효과적이었습니다. – ahsteele