2

いくつかの認証とカスタム エラー ハンドラーを使用して WCF サービスを作成しています。ただし、この問題に直面しています。私の実装はIErrorHandler、認証が例外をスローしたときにヒットしませんが、他の例外では問題なく実行されます。

認証IErrorHandlerはビルド前に実行されますか? それらのエラーをキャッチするために間違ったツリーを吠えていますか?

FaultExceptionはい、認証に ではなく をスローしようとしました (そして現在) SecurityTokenException

4

1 に答える 1

2

したがって、最初に、カスタム エラー ハンドラも 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 の場合、それらをすぐに Fault Exceptions に変換する必要はありません。実際には、サービス/サーバーがセキュリティ認証が失敗したことを認識し、「403 : アクセスが拒否されました」の障害同等物として自動的に返すために、カスタム検証でこれらを SecurityTokenExceptions としてスローする必要があります。私は 100% ではありませんが、エラー ハンドラーなどのカスタム サービスの動作が読み込まれる前に、カスタムの認証と検証の部分が発生すると思います。残念ながら、認証で何かをトラブルシューティングする必要がある場合は、サービスで WCF トレースを有効にする必要があります。この記事「WCF トレースを有効にする方法」を参照してください。

失敗した認証試行をログに記録する必要がある場合は、おそらくそれをカスタム バリデーターに直接配置する必要があります。

于 2012-06-26T15:20:49.907 に答える