2011-10-17 7 views
5

Tôi đang cố giải quyết tham chiếu vòng tròn trong dịch vụ web. Các giải pháp xây dựng tốt và một số hoạt động được gọi, nhưng một trong đó sử dụng một loại tham chiếu cho một ngoại lệ tham chiếu vòng tròn (dưới đây).Tham khảo thông tư trong dịch vụ web

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() 

Kiến trúc trông gần như thế này:

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

Mỗi lớp là một tài liệu tham khảo dịch vụ web lắp ráp riêng và cả ba cụm. Tôi đã đính kèm một trình gỡ lỗi nhưng nó không bị hỏng. Có vẻ như các internals đang thất bại nhưng tôi không có ý tưởng nơi mà tất cả mọi thứ được xây dựng. Làm thế nào tôi sẽ đi về gỡ lỗi này?

+0

bạn có tham chiếu đến lớp Core từ giao diện người dùng ở đâu, tôi đoán, bạn đang gọi các dịch vụ web? –

+0

Tại sao không có dịch vụ web chỉ nói chuyện với lớp logic, và lớp logic chỉ nói chuyện với lớp dữ liệu. Điều này sẽ dẫn đến một số phương thức chỉ truyền dữ liệu từ lớp này sang lớp khác, nhưng có thể giải quyết vấn đề của bạn. –

Trả lời

4

Tham chiếu vòng tròn của bạn không có trong tệp dự án, nhưng trong các đối tượng bạn cố gửi qua webservice. Một đối tượng của bạn có một tham chiếu đến chính nó hoặc một đối tượng tham chiếu đến đối tượng.

Thông báo lỗi cho bạn để tìm trong kiểu của bạn: MyCoreAssembly.MyType

+0

Cảm ơn, điều này có ý nghĩa. Thay vì chỉ là một autoproperty đơn giản, tôi đã phải chuyển đổi nó vào một tài sản với lĩnh vực sao lưu và thêm một vài thuộc tính. ' _ _Branch Private Như PropertyListBase = Nothing _ _ Chi nhánh công sản() Như PropertyListBase Nhận Return _Branch Cuối Get Set (ByVal giá trị Theo PropertyListBase) _Branch = giá trị Bộ kết thúc Thuộc tính kết thúc' – Echilon

0

Lớp rằng tài liệu tham khảo chính nó nên được trang trí với các thuộc tính DataContract. Thiết lập quá tải IsReference = thành true sẽ cho phép tham chiếu vòng tròn. [DataContract (IsReference = True)]