4

ServiceExceptionHandler拡張するサービスでを使用しようとしていますRestServiceBase<TViewModel>

を使用できますAppHost.ServiceExceptionHandler。正常に動作しています。HttpRequestAppHost レベルでは利用できないからのユーザー情報が必要です。

だから私はServiceExceptionHandlerサービスレベルで使用しようとしています。ctorserviceにデリゲートを設定しましたが、メソッドnullで例外がスローされたときですOnGet

public class StudentService : RestServiceBase<Student>
{ 
    public StudentService()
    {
        ServiceExceptionHandler = (request, exception) =>
        {
            logger.Error(string.Format("{0} - {1} \n Request : {2}\n", HttpRequest.UserName(), exception.Message, request.Dump()), exception);
            var errors = new ValidationErrorField[] { new ValidationErrorField("System Error", "TODO", "System Error") };
            return DtoUtils.CreateErrorResponse("System Error", "System Error", errors);
        };
    }
}

このコードの何が問題なのかわかりません。どんな助けでも大歓迎です。

4

1 に答える 1

6

グローバル AppHost.ServiceExceptionHandler を登録する

AppHost.Configure()グローバル例外ハンドラーを次のように登録できます。

this.ServiceExceptionHandler = (request, ex) => {
   ... //handle exception and generate your own ErrorResponse
};

よりきめ細かい例外ハンドラーの場合、次のカスタム サービス イベント フックをオーバーライドできます。

新しい API による例外の処理

新しい APIを使用している場合は、カスタム ランナーを提供することで例外をオーバーライドできます。次に例を示します。

public class AppHost { 
  ...
    public virtual IServiceRunner<TRequest> CreateServiceRunner<TRequest>(
        ActionContext actionContext)
    {           
        //Cached per Service Action
        return new ServiceRunner<TRequest>(this, actionContext); 
    }
}

public class MyServiceRunner<T> : ServiceRunner<T> {
    public override object HandleException(
        IRequestContext requestContext, TRequest request, Exception ex) {
      // Called whenever an exception is thrown in your Services Action
    }
}

古い API で例外を処理する

RestServiceBase<T>これは、 HandleExceptionメソッドをオーバーライドすることでエラーを処理できる古い API を使用します。

public class StudentService : RestServiceBase<Student>
{ 
    ...

    protected override object HandleException(T request, Exception ex)
    {
        LogException(ex);

        return base.HandleException(request, ex);
    }
} 
于 2012-10-24T21:48:21.333 に答える