System.IdentityModel.Selectors.UserNamePasswordValidator クラスのオーバーライドされた Validate() メソッドを介してカスタム UserName 検証を使用するように構成された WCF サービスがあります。
コントラクトのすべてのメソッドは、FaultContractAttribute で装飾されており、カスタム SOAP エラーが返されるように指定されています。
FaultException<T> (T は FaultContractAttribute で指定された型) をスローすると、すべてが期待どおりに動作し、応答 XML でカスタム エラーを取得します。
ただし、ユーザー名認証クラスのオーバーライドされた Validate() メソッドで FaultException<T> をスローしようとすると、次の理由で一般的な SOAP エラーが発生します。
「この障害の作成者は理由を特定しませんでした。」
ただし、次のように一般的な SOAP エラーをスローするようにコードを変更すると、次のようになります。
throw new FaultException("Authentication failed.");
少なくとも「認証に失敗しました」と表示されます。reason 要素で。
私の質問は次のとおりです。
- Validate() でスローされた場合、FaultException<T> 例外がサービス実装内にあるため、同じように扱われないのはなぜですか?
- Validate() メソッドでスローされた例外を、コントラクト メソッドで指定された FaultContractAttribute に準拠させることは可能ですか?
どんな助けでも大歓迎です。私自身の推測では、メッセージがコントラクトのメソッドに関連付けられる前に認証が行われるため、FaultContractAttribute には関連付けられませんが、これを確認して回避策を提供する記事は非常に役立ちます。
タリ