特注のレガシー メッセージ形式 (xml) に対処する必要がある wcf サービスを作成しています。着信 xml を最初に解析すると、それは SelectOperation メソッドの IDispatchOperationSelector にあります。
最初に行うことは、xsd に対して xml を検証して、着信メッセージが正しい形式であることを確認することです。この検証に失敗した場合、私は XmlSchemaValidationException をスローし、それを IErrorHandler 実装でキャッチして、クライアントに 400 - Bad Request エラーを返すつもりでした。
残念ながら、IErrorHandler の ProvideFault メソッドでは、OperationContext.Current は null です。これは、OperationSelector が OperationContext.Current 作成の一部であるか、その前に呼び出されるためだと思います。そのため、OperationSelector でエラーをスローする代わりに、Operation Selector で文字列 "error" を返し、message.Headers.Action も "error" に設定し、必要な例外をメッセージ プロパティに追加してから、操作コンテキストの作成後にスローします。
問題は、ヒットするコードの次の拡張ポイントが ServiceAuthenticationManager.Authenticate メソッドであることです。message.Headers.Action をチェックしてエラーを見つけ、このメソッドでそのエラーをスローすると、フレームワークによって飲み込まれ、エラー ハンドラーに配信されるエラーは「ユーザーが認証されていません」であり、これは理にかなっていると思います。
したがって、私の質問は、WCF に、これら 2 つのメソッド間でこのエラーをスローできる拡張ポイントがあるかどうかということだと思います。