2011-08-08 9 views
1

いくつかの認証とカスタムエラーハンドラを持つWCFサービスを作成しています。しかし、私はこの問題に対処しています。IErrorHandlerの実装は、認証が例外をスローするとヒットしませんが、他の例外とうまく動作します。WCF - IErrorHandler vs認証

IErrorHandlerより前に認証が実行されますか?私は間違った木を吠えて、それらのエラーをキャッチするようにしていますか?

はい、FaultExceptionを私の認証で投げてみましたが、SecurityTokenExceptionではありません。

答えて

1

最初に、カスタムエラーハンドラがIServiceBehaviorも実装していることを確認します。 IServiceBehaviorでは、他にいくつかのメソッドを実装する必要がありますが、重要なのは "ApplyDispatchBehavior"です。ここでは、ErrorHandlerをチャンネルディスパッチャに追加する必要があります。

C#

public class CustomErrorHandler: IServiceBehavior, IErrorHandler 
{ 
    public bool HandleError(Exception error) 
    { 
     //Return True here if you want the service to continue on as if 
     // the error was handled 

     return true; 
    } 

    public void ProvideFault(Exception error, 
          MessageVersion version, 
          ref Message fault) 
    { 
     FaultException fe = new FaultException(
      new FaultReason(error.Message), 
      new FaultCode("Service Error")); 

     MessageFault mf = fe.CreateMessageFault(); 
     fault = Message.CreateMessage(version, mf, fe.Action); 
    } 

    public void ApplyDispatchBehavior(ServiceDescription serviceDescription, 
             ServiceHostBase serviceHostBase) 
    { 

     IErrorHandler eh = new CustomErrorHandler(); 

     foreach (ChannelDsipatcherBase cdb in serviceHostBase.ChannelDispatchers) 
     { 
      ChannelDispatcher cd = cdb as ChannelDispatcher; 
      cd.ErrorHandlers.Add(eh); 
     } 

    } 

    public void AddBindingParameters(ServiceDescription serviceDescription, 
            ServiceHostBase serviceHostBase, 
            Collection<ServiceEndpoint> endpoints, 
            BindingParameterCollection bindingParameters) 
    { 
     //Add binding parameters if you want, I am not 
    } 

    public void Validate(ServiceDescription serviceDescription, 
         ServiceHostBase serviceHostBase) 
    { 
     //Add custom fault validation here if you want 
    } 
} 

その後、すべてのあなたのスローされた例外が変換されます。この方法は、サービスの振る舞いとしてCustomErrorHandlerを追加し、行動に

web.configファイル

<system.serviceModel> 
    <extensions> 
     <behaviorExtensions> 
      <add name="ErrorHandler" 
       type="ServiceNamespace.CustomErrorHandler, ServiceNamespace, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null"/> 
     </behaviorExtensions> 
    </extensions> 
    <behaviors> 
     <serviceBehaviors> 
      <behavior name="MyBehavior1"> 
       <!--Put other behaviors for your service here then add the next line--> 
       <ErrorHandler /> 
      </behavior> 
     </serviceBehaviors> 
    </behaviors> 
</system.serviceModel> 

を追加する必要があります障害に戻ってクライアントに戻ります。

SecurityTokenExceptionsの場合は、それらをすぐにフォールト例外に変換する必要はありません。セキュリティ認証が失敗したことをサービス/サーバーが認識し、自動的に "403:アクセスが拒否されました"というエラーequivとして返すために、カスタム検証でSecurityTokenExceptionsとしてこれらをスローしたいとします。私は100%ではありませんが、エラーハンドラのようなカスタムサービスの動作がロードされる前に、カスタムの認証と検証が行われると思います。残念ながら、認証で何か問題を解決する必要がある場合は、サービスでWCFトレースをオンにする必要があります。この記事の "How to turn on WCF Tracing"を参照してください。

失敗した認証の試行をログに記録する必要がある場合は、おそらくカスタム検証ツールに直接入力する必要があります。