0

ExceptionsJSONService という WCF サービスがあります。私のソリューションで定義されている他のすべてのサービスとは異なり、何らかの理由で JavaScript でクライアント側をインスタンス化することはできません。

これは失敗します:

var service = new ExceptionsJSONService();

オブジェクトが必要です。なぜこれが起こるのかを理解しようとしており、プロジェクト全体ですべての定義をチェックしましたが、すべてがうまく見え、定義した他のすべてのサービスと一致しています (すべて動作します)。

次に、svclog ファイルを確認したところ、エラーが見つかりました。例外の種類は次のとおりです。

System.Runtime.Serialization.InvalidDataContractException、System.Runtime.Serialization、バージョン = 4.0.0.0、カルチャ = ニュートラル、PublicKeyToken = b77a5c561934e089

例外メッセージは次のとおりです。

タイプ 'System.Data.Entity.DbSet`1[CCMModel.AttachmentDoc]' をシリアル化できません。これを DataContractAttribute 属性でマークし、シリアル化するすべてのメンバーを DataMemberAttribute 属性でマークすることを検討してください。型がコレクションの場合は、CollectionDataContractAttribute でマークすることを検討してください。サポートされているその他の型については、Microsoft .NET Framework のドキュメントを参照してください。

CCMModel は名前空間で、AttachmentDoc は私のエンティティの 1 つです。ただし、問題は AttachmentDoc にはありません。エンティティのリストをアルファベット順に調べているだけです。エンティティの名前を Attachments から RAttachments に変更したところ、AttachmentDoc で例外をスローするようになりました。

問題は、コードのどこにも EF エンティティをシリアル化しようとしないことです。私がシリアル化するすべてのクラスには DataContracts があります。この 2 つが関連していると思われる理由は、Open ServiceHost 'ExceptionsJSONService' が svclog に表示された直後に例外が発生するためです。

誰もこれに遭遇しましたか?

4

1 に答える 1

0

この問題は、ExceptionsJSONService クラスで定義された public 関数が原因でした。関数は公開されているはずですが、操作契約としてもマークされていました。

関数のパラメーター リストには、EF DB コンテキスト オブジェクトが含まれていました。これはオペレーション コントラクトのパラメーター リストに含まれていたため、サービスは DB コンテキストに関連付けられたすべてのエンティティのデータ コントラクトを検索しました。これにより、サービス トレース ログにのみ表示される例外がスローされました。例外により、サービスが適切にロードされないため、JavaScript でサービス クライアント側をインスタンス化しようとすると失敗します。

関数から Operation Contract 属性を削除すると、問題が解決しました。

于 2013-07-18T19:42:22.583 に答える