【问题标题】:Circular reference in web serviceWeb服务中的循环引用
【发布时间】:2011-10-17 15:58:13
【问题描述】:

我正在尝试解决 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()

架构大致如下:

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

每一层都是一个单独的程序集,Web 服务引用所有三个程序集。我已经附加了一个调试器,但它不会中断。看起来内部结构正在失败,但我不知道一切都在哪里构建。我该如何调试呢?

【问题讨论】:

  • 您是否从 UI 中引用了 Core 层,我猜您在哪里调用 Web 服务?
  • 为什么不让web服务只和逻辑层对话,而逻辑层只和数据层对话。这将导致某些方法仅将数据从一层传递到另一层,但可能会解决您的问题。

标签: asp.net web-services assemblies


【解决方案1】:

您的循环引用不在项目文件中,而是在您尝试通过网络服务发送的对象中。你们中的一个对象具有对自身的引用或引用该对象的对象。

错误消息告诉您查看您的类型:MyCoreAssembly.MyType

【讨论】:

  • 谢谢,这是有道理的。我不得不将它转换为带有支持字段的属性并添加一些属性,而不仅仅是一个普通的自动属性。 &lt;NonSerialized()&gt; _ Private _Branch As PropertyListBase = Nothing &lt;ScriptIgnore()&gt; _ &lt;IgnoreDataMember()&gt; _ &lt;XmlIgnore()&gt; Public Property Branch() As PropertyListBase Get Return _Branch End Get Set(ByVal value As PropertyListBase) _Branch = value End Set End Property
猜你喜欢
  • 2011-08-11
  • 2016-07-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多