1

私は WCF サービスを開発しています。エラーが発生した場合は、サービスで呼び出された元のメソッドから受信パラメーターをシリアル化したいと考えています。IErrorHandler を使用してすべての例外をキャッチしています。

私の最初の考えは、シリアル化されたパラメーターを OperationContext.IncomingMessageProperties に格納して、HandleError メソッドからアクセスできるようにすることでした。ただし、これは元のスレッドで実行されないため、OperationContext が null になると思われるため、ProvideFault メソッドからアクセスすることを検討しています。

これは実現可能だと思いますか?また、OneWay サービス コールで動作しますか?

4

1 に答える 1

2

ここで本当にあなたを助けることができるかどうかはわかりませんが、試してみましょう:

クライアントでは、コードは基本的にメソッドを呼び出してパラメーターを渡します。次に、クライアント側の WCF スタックは、それをヘッダーとすべてを含む SOAP メッセージ (通常は XML 本文を使用しますが、バイナリの場合もあります) に変換し、そのメッセージをネットワーク経由でサーバーに送信して処理します。

次に、サーバーはそのメッセージをオブジェクトにデシリアライズし、サーバー実装オブジェクトでメッセージを呼び出そうとします。サーバー オブジェクトのそのメソッドは、クライアントと同じパラメーターを持つ可能性が高くなりますが、そのメソッドが呼び出される前に呼び出しが失敗する可能性があります。

つまり、私が言おうとしているのは、パラメーターを使用したサーバー側のメソッドが実際に呼び出されるという事実に頼ることはできないということです。たとえば、認証、メッセージ形式、ヘッダーの欠落などに問題があった可能性がありますそうしないと、サーバー側のメソッドが呼び出される前であっても、サーバー側が失敗し、例外がスローされます。

最後に、IErrorHandler では、メッセージおよび/またはメソッドとそのパラメーターを取得する方法を知る方法はありません。取得できるのは、サーバーで発生したエラーだけであり、それを使用してそれを SOAP フォルトに変えます。

クライアント側とサーバー側の両方でできることは、WCF スタックにプラグインし、呼び出されるメソッドと渡されるパラメーターを記録する新しい動作を作成することIParameterInspectorです。 WCF。ただし、クライアントとサーバー上のメッセージが適切に逆シリアル化され、サーバー側のメソッドが実際に呼び出される場合にのみ呼び出されます。

WCF の拡張性の詳細については、次のリンクを参照してください。

これが少し役立つことを願っています!

マルク

于 2009-08-02T08:05:32.220 に答える