RestServiceBase <T>上的ServiceExceptionHandler用法

Sat*_*aga 4 servicestack

我正在尝试使用ServiceExceptionHandler延伸的SerivceRestServiceBase<TViewModel>

我可以使用AppHost.ServiceExceptionHandler,这工作正常.我需要来自HttpRequestAppHost级别不可用的用户信息.

所以我正在尝试使用ServiceExceptionHandleron Service级别.虽然我将委托设置为服务ctor,但是nullOnGet方法抛出异常时

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);
        };
    }
}
Run Code Online (Sandbox Code Playgroud)

我不确定这段代码有什么问题.任何帮助将不胜感激.

myt*_*thz 6

注册Global AppHost.ServiceExceptionHandler

在你的AppHost.Configure(),你可以注册一个全球性的异常处理程序:

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

对于更细粒度的Exception处理程序,您可以覆盖以下自定义服务事件挂钩:

使用新API处理异常

如果您正在使用New API,则可以通过提供自定义运行器来覆盖Exception,例如:

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
    }
}
Run Code Online (Sandbox Code Playgroud)

使用旧API处理异常

RestServiceBase<T>使用旧API,您可以通过重写HandleException方法来处理错误,例如:

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

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

        return base.HandleException(request, ex);
    }
} 
Run Code Online (Sandbox Code Playgroud)