2012-01-18 15 views
0

私は、C#.netコンソールアプリケーションでWSDL + XSDからSVCUTILを使用してクライアントを生成しました。 WSDLで定義されていないレスポンスメッセージを受信する可能性があるため、デシリアライズ&は失敗しますが、メソッドは例外をスローしませんがnullを返します。WCFからの未知のsoapメッセージの処理

この状況を処理する一般的な方法はありますか、フォールト/エラーメッセージxsd(サーバーから返されたSOAPメッセージ用)を定義し、ヌル応答の場合はメッセージを処理/逆シリアル化します。

PS:私のリモートサービスは、論理エラーのフォールト例外をスローすることはできません(ええ閉塞のビットが)。

+2

サービスがWSDLにないメッセージを返す場合、サービスは壊れています。どのように "壊れていない"? –

+0

こんにちはJohn、あなたの返事をありがとう。それは壊れていない、私はメソッドを呼び出すと、私はnullレスポンス、例外は、私はバイブレータを使用し、それが別のメッセージだった返された参照してください、メッセージの契約によってdeserializedすることはできません。論理的なエラー(制限)のために石鹸の故障を投げることができないので、サービスから別のメッセージを返さなければなりません。 – SSA

+2

それは意味をなさない。サービスから返される可能性のあるものはすべてWSDLで定義されている必要があります。 –

答えて

2

WSDLは契約しています。 2つのオブジェクトがあり、それらの間にインタフェースが定義されている場合と同じです。最初のオブジェクトが2番目のオブジェクトに対する操作を呼び出すと、interfaceで定義された戻り値が必要です。非厳密型言語を使用すると、2番目のオブジェクトは異なるタイプの戻り値を返すことができ、予期しないエラーのために最初のオブジェクトが失敗します。

プログラミング言語にはこれを解決するアプローチがあります - .NETの場合は戻り値としてobject型を使用し、受け取った型と戻り値の扱い方を手動で調査する必要があります。 WCFの場合でも、このようなハイレベルタイプ - System.ServiceModel.Channels.Messageがありますが、実際には使用したくないのです。そのような場合は、手動でSOAPリクエストを作成し、受信したレスポンスを手動で解析する必要があるからです。単一の要求タイプが常に単一の応答のタイプ及び(SOAPフォルトである)は、ゼロ以上のエラー・タイプを持つWebサービスにサイドノートとして

。単一のリクエストタイプで異なる応答タイプを返すサービスがある場合、そのようなサービスは「有効な」Webサービスではなく、WSDLで記述することはできません。そのため、自動生成されたWCFプロキシによって提供される強く型付けされた方法でもできません。

+0

返事ありがとうございます、私はWCFの面で標準ではない状況があります。私は再び説明しようとする。私のWSDLメソッドは、入出力パラメータ(複合型)のみを持っています。このメソッドは、論理エラーまたはカスタムエラーに対して手動で例外をスローするようなことを公開しないツールを使用して作成されます。そこで、別のメッセージを出力レスポンスとしてキャストするオプションがあります。さて、それを受け取って、生成されたクライアントは、それを行う方法がわからないので、応答を逆シリアル化できません。だから、私はこの標準化の失敗を処理するための標準的な方法があることを知りたがっています。私が明確であることを望みます。 – SSA

+1

いいえ、そうではありません。そのような場合は、SOAPメッセージを直接操作する必要があります。異なる出力を書き込むことは、Webサービスでは有効ではありません。複数の出力タイプが必要な場合は、最初の出力をモデル化してテーマをサポートする必要があります。たとえば、結果コードのフィールドを追加するか、XSDの選択肢を内部的に使用します。 –

+0

さて、わかりました。 Message XSDに結果の型フィールドを追加し、カスタムエラーの応答としてチェックします。再度、感謝します。 – SSA