我正在尝试使用ServiceExceptionHandler
来延伸RestServiceBase<TViewModel>
我可以使用AppHost.ServiceExceptionHandler
,这工作正常。我需要来自HttpRequest
的用户信息,这些信息在AppHost级别不可用。
所以我试图在服务级别上使用ServiceExceptionHandler
。虽然我在服务ctor
上设置了委托,但在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);
};
}
}
我不确定此代码的问题是什么。任何帮助将不胜感激。
答案 0 :(得分:6)
在AppHost.Configure()
中,您可以使用以下命令注册全局异常处理程序:
this.ServiceExceptionHandler = (request, ex) => {
... //handle exception and generate your own ErrorResponse
};
对于更细粒度的Exception处理程序,您可以覆盖以下自定义服务事件挂钩:
如果您正在使用New 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
}
}
RestServiceBase<T>
使用旧API,您可以通过覆盖 HandleException 方法来处理错误,例如:
public class StudentService : RestServiceBase<Student>
{
...
protected override object HandleException(T request, Exception ex)
{
LogException(ex);
return base.HandleException(request, ex);
}
}