2011-10-17 11 views
5

Webサービスで循環参照を解決しようとしています。このソリューションはうまく構築され、いくつかの操作は呼び出し可能ですが、参照される型を使用するものは循環参照例外(下記)を提供します。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サービス参照すべての3つのアセンブリです。私はデバッガを付けましたが、それは壊れません。内部が故障しているように見えますが、すべてが構築されているので、私は考えていません。これをデバッグするにはどうすればいいですか?

+0

Webサービスを呼び出すUIのコアレイヤーへの参照がありますか? –

+0

なぜWebサービスはロジックレイヤーとしか話せず、ロジックレイヤーだけがデータレイヤーに話しかけます。これは、あるレイヤーから別のレイヤーにデータを渡すだけの方法につながりますが、問題を解決する可能性があります。 –

答えて

4

循環参照はプロジェクトファイルではなく、Webサービス経由で送信しようとするオブジェクトにあります。あなたのオブジェクトの1つは、オブジェクトへの参照またはオブジェクトを参照するオブジェクトへの参照を持ちます。

エラーメッセージがあなたのタイプに見てあなたを教えて:MyCoreAssembly.MyType

+0

ありがとう、これは理にかなっています。単純な自動作成の代わりに、私はそれをバッキングフィールドを持つプロパティに変換し、いくつかの属性を追加する必要がありました。 ' _ PropertyListBase =何も _ _ 公開プロパティ支店()として、プライベート_BranchはPropertyListBase として 戻り_Branch エンド セット(ByValのをゲット値As PropertyListBase) _ブランチ=値 終了セット 終了プロパティ ' – Echilon

0

参照自体がのDataContract属性で装飾する必要があり、そのクラス。オーバーロードIsReference =をtrueに設定すると、循環参照が有効になります。 [DataContract(IsReference = True)]