1

私は、NHibernate を使用するリポジトリにアクセスする WCF サービスにアクセスする Silverlight 3 UI を持っています。WCF での NHibernate の遅延読み込みの問題を克服するために、http: //timvasil.com/blog14/post/2008/02/WCF-serialization-with-NHibernate.aspxで説明されているように、独自の DataContract サロゲートを使用しています。ここでは preserveObjectReferences = true を設定しています

私のモデルにはサイクルが含まれています (つまり、IList[Order] を持つ顧客)

サービスからオブジェクトを取得すると問題なく動作しますが、同じオブジェクトを wcf サービスに送り返そうとすると、次のエラーが発生します。

System.ServiceModel.CommunicationException はユーザー コードによって処理されませんでした Message=パラメーター http://tempuri.org/:searchCriteriaをシリアル化しようとしているときにエラーが発生しました。InnerException メッセージには「オブジェクト グラフ ...」が含まれており、参照が追跡されていない場合はシリアル化できません。IsReference プロパティを true に設定して DataContractAttribute を使用することを検討してください。

Silverlight では循環参照が問題になっているため、DataContract を [DataContract(IsReference=true)] に変更しようとしましたが、サービスからオブジェクトを取得しようとすると、次の例外が発生します。

System.ExecutionEngineException が処理されませんでした メッセージ = タイプ 'System.ExecutionEngineException' の例外がスローされました。内部例外:

何か案は?

4

2 に答える 2

1

これは、.Net3.5のSilverlight3とWCFの両方のバグでした。

.Net4とSilverlight4にアップグレードしましたが、すべて(循環参照と、WCFからのインターフェイスタイプの返送)がうまく連携しています。

于 2010-04-23T04:46:36.567 に答える
0

クライアントとサーバーの両方でIsReference=trueを使用しましたか?

この問題はJamesKovacsによって解決されました。ここにリンクを投稿します:

1つのオプション

そして、これはより良い解決策です:

操作またはサービススコープの循環参照を有効にするには、カスタム動作などを使用できます。基本的に、シリアライザーのインスタンス化プロセスにフックし、上記のオーバーロードを使用してインスタンスを作成する機能が必要です。

  1. サブクラスDataContractSerializerOperationBehavior

  2. OvverrideCreateSerializerメソッド

  3. trueをpreserveObjectReferencesパラメータに渡す新しいDCSインスタンスを作成します。

ここから

于 2010-04-21T11:25:37.030 に答える