2011-10-17 4 views
5

웹 서비스에서 순환 참조를 해결하려고합니다. 솔루션은 잘 빌드되고 일부 조작은 호출 가능하지만 참조 된 유형을 사용하는 조작은 순환 참조 예외 (아래)를 제공합니다.웹 서비스의 순환 참조

System.InvalidOperationException: There was an error generating the XML document. ---> System.InvalidOperationException: A circular reference was detected while serializing an object of type MyCoreAssembly.MyType <-------- this is the referenced type 
    at System.Xml.Serialization.XmlSerializationWriter.WriteStartElement(String name, String ns, Object o, Boolean writePrefixed, XmlSerializerNamespaces xmlns) 
    at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriter1.Write21_VRD(String n, String ns, VRD o, Boolean isNullable, Boolean needType) 
    at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriter1.Write21_VRD(String n, String ns, VRD o, Boolean isNullable, Boolean needType) 
    at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriter1.Write31_Hereditament(String n, String ns, Hereditament o, Boolean isNullable, Boolean needType) 
    at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriter1.Write32_HereditamentVrd(String n, String ns, HereditamentVrd o, Boolean isNullable, Boolean needType) 
    at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriter1.Write33_VRDResponse(String n, String ns, VRDResponse o, Boolean isNullable, Boolean needType) 
    at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationWriter1.Write43_VRDResponse(Object o) 
    at Microsoft.Xml.Serialization.GeneratedAssembly.VRDResponseSerializer.Serialize(Object objectToSerialize, XmlSerializationWriter writer) <------- this is my type 
    at System.Xml.Serialization.XmlSerializer.Serialize(XmlWriter xmlWriter, Object o, XmlSerializerNamespaces namespaces, String encodingStyle, String id) 
    --- End of inner exception stack trace --- 
    at System.Xml.Serialization.XmlSerializer.Serialize(XmlWriter xmlWriter, Object o, XmlSerializerNamespaces namespaces, String encodingStyle, String id) 
    at System.Xml.Serialization.XmlSerializer.Serialize(TextWriter textWriter, Object o, XmlSerializerNamespaces namespaces) 
    at System.Web.Services.Protocols.XmlReturnWriter.Write(HttpResponse response, Stream outputStream, Object returnValue) 
    at System.Web.Services.Protocols.HttpServerProtocol.WriteReturns(Object[] returnValues, Stream outputStream) 
    at System.Web.Services.Protocols.WebServiceHandler.WriteReturns(Object[] returnValues) 
    at System.Web.Services.Protocols.WebServiceHandler.Invoke() 

이 아키텍처는 다음과 같이 대략 같습니다

Core layer <------ Data Layer <----- Logic Layer <---------- Web service 
        \/--------------------\/ <-------------------| 
              \/--------------------| 

각 층은 별도의 조립 및 웹 서비스 참조 세 가지 어셈블리입니다. 디버거를 연결했지만 중단되지 않습니다. 내부가 실패하고있는 것처럼 보이지만 모든 것이 만들어지면 나는 전혀 몰라요. 어떻게 디버깅을할까요?

+0

웹 서비스를 호출하는 UI에서 코어 레이어에 대한 참조가 있습니까? –

+0

왜 웹 서비스는 논리 계층과 만 통신하고 논리 계층은 데이터 계층과 만 통신해야합니까? 이렇게하면 한 레이어에서 다른 레이어로 데이터를 전달하는 일부 메소드로 이어지지 만 문제를 해결할 수 있습니다. –

답변

4

순환 참조는 프로젝트 파일이 아니고 웹 서비스를 통해 보내려고하는 개체에 있습니다. 여러분 중 하나는 자신이나 객체를 참조하는 객체에 대한 참조를 가지고 있습니다.

오류 메시지

은 유형에보고 말씀 : MyCoreAssembly.MyType

+0

감사합니다. 그냥 평범한 자동 속성 대신에 그것을 뒷받침 필드가있는 속성으로 변환하고 몇 가지 특성을 추가해야했습니다. ' _ PropertyListBase = 아무것도 로 개인 _Branch _ _ Public 속성 지점() PropertyListBase 으로 반환 _Branch 끝 세트를 가져 오기 (ByVal의 값 As PropertyListBase) _ 브랜치 = 값 끝 집합 끝 속성' – Echilon

0

참조 자체가를 DataContract 특성으로 장식해야하는 클래스입니다. 오버로드 IsReference =를 true로 설정하면 순환 참조가 활성화됩니다. [DataContract (IsReference = True)]