1

WCF を使用して Web サービスを実装しています。この Web サービスには、各サービスのヘルス モニターとして「ping」機能が必要です。この機能は IDispatchMessageInspector を使用して実装されており、サービスのエンドポイントごとに構成されています。これは、「ping」を実際のサービス コードにできるだけ近づけるというビジネス上の要件によるものです。同時に、これを各サービス実装のコードに結び付けたくはありませんでした。IDispatchMessageInspector が適しているようです。

このサービスは、Request-Reply MEP を使用します。各要求メッセージには、必要な処理を指定する要素が含まれています。次に、サービスはこの値を使用して、メッセージ内のデータを処理する方法を決定します。同じ要素を使用して、リクエスト メッセージを「ハートビート」チェックとして定義します。

「ping」メッセージ インスペクターは、AfterReceiveRequest() メソッドで要求メッセージを前処理し、要求が「ハートビート」であると判断した場合、正しい応答を生成し、それを BeforeSendReply() メソッドに渡します。 AfterReceiveRequest() から返される相関オブジェクト。参照による AfterReceiveRequest() の要求メッセージ パラメータは、サービス実装コードによってメッセージが処理されないように null に設定されます。

リクエスト メッセージを null に設定する手法は、私が覚えていない、または URL を見つけることができない Web サイトまたはブログで見つかりました。この手法は単独でうまく機能し、「ハートビート」リクエストの場合にサービス実装コードが実行されるのを防ぐことができます。

残念ながら、メッセージ インスペクターで要求メッセージを null に設定すると、WCF ランタイムは常に NullReferenceException をスローします。スタック トレースから、ランタイムが引き続きメッセージ オブジェクト (「Ping」メッセージ インスペクターを通過した後は null になる) をディスパッチャーに渡し、ディスパッチャーが null メッセージ オブジェクトを逆シリアル化しようとすると、NullReferenceException が発生することがわかりました。

ただし、私のシステムは IErrorHandler も実装して、サービスで未処理の例外をキャッチしてログに記録します。これは、「ハートビート」リクエストが成功するたびに NullReferenceException のログ エントリが生成され、「ハートビート」が 1 分おきに発生する可能性があることを意味します。

質問 :

「Ping」がリクエストをnullに設定することによってサービス実装コードの実行を妨げているときにスローされる「役に立たない」NullReferenceExceptionのロギングを防ぐにはどうすればよいですか。

よろしくお願いします。
~hg

4

1 に答える 1

0

最も適切な解決策ではありませんが、潜在的な回避策 (私はテストしていません) ですが、インスペクター コードで ping 呼び出しを検出した場合、独自のカスタム例外タイプ、つまり PingRequestException をスローして、クライアントに戻ったときにこれを処理できませんか? ? これにより、WCF ランタイム コードにアクセスすることを回避でき、未処理の例外のログ記録を回避できます。

それ以外の場合は、実際のサービス コードを実行する前にコンストラクターで ping 要求を検出して処理する、すべてのサービス (wcf ランタイム コードの反対側) によって継承される基本サービスの使用を試みることができます。

于 2009-12-01T11:32:38.870 に答える