Web サービスを仕様に合わせて記述しようとしていますが、メソッドが正常に完了するかどうかに応じて、異なる応答本文が必要です。2 つの異なる DataContract クラスを作成しようとしましたが、それらを返して正しくシリアル化するにはどうすればよいですか?
3 に答える
WCF Web サービスが失敗したことを示す最善の方法は、FaultException をスローすることです。サービスの web.config ファイルには、エラー メッセージ全体をエラーの一部としてクライアントに渡すことができる設定があります。
もう 1 つの方法は、同じ基本クラスまたはインターフェイスから両方の結果を継承することです。サービスは基本型のインスタンスを返します。その後、KnownType 属性を使用して、複数の型が返される可能性があることをクライアントに通知できます。考えてみれば、Object を基本型として使うことも可能かもしれませんが、私は試していません。
これらのアプローチのいずれにも失敗した場合、result プロパティと error プロパティの両方を含むカスタム結果オブジェクトを作成できます。その後、クライアントは実行するアクションを決定できます。Beta 2 はまだフォールト コントラクトを完全にサポートしていないため、Silverlight 2 ではこのアプローチを使用する必要がありました。きれいではありません。通常はお勧めしませんが、それが機能する唯一の方法である場合、または状況に最適なアプローチであると感じている場合...
ADO.NET Data Services で問題が発生している場合、私には経験がありません。
FaultContractsの実装に関する情報を次に示します。
答えは「はい」ですが、それは難しく、インターフェースで強力なタイピングができなくなります。Streamを返す場合、データは xml、テキスト、またはバイナリ イメージである可能性があります。DataContract クラスの場合は、DataContractSerializerを使用してデータをシリアル化します。
詳細については、BlogSvcを参照してください。具体的にはRestAtomPubService.cs WCF サービスを参照してください。ソース コードは、コンテンツ タイプ マッパーを必要とする WCF レスト メソッドにさまざまなタイプのデータを受け入れる方法も示すことに注意してください。
xml ベースのバインドを使用している場合、それを行う方法はないと思います。その場合の簡単な解決策は、障害が発生した場合にメッセージ フラグの一部を保持し、必要に応じて障害情報をどこかに保存することです。JSON バインディングの場合、オブジェクトを返すメソッドを使用してから、2 つの異なるタイプのオブジェクトを返すことができます。私の記憶が正しければ (これはめったにありません)、オブジェクトにシリアライゼーション属性がない場合、JavaScriptSerializer クラスはリフレクションを使用するため、それが可能です。