我正在尝试在扩展ServiceExceptionHandler
的Serivce上使用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);
};
}
}
我不确定这段代码是什么问题。任何帮助将不胜感激。
最佳答案
注册全局AppHost.ServiceExceptionHandler
在您的AppHost.Configure()
中,您可以使用以下命令注册全局异常处理程序:
this.ServiceExceptionHandler = (request, ex) => {
... //handle exception and generate your own ErrorResponse
};
对于更细粒度的异常处理程序,您可以覆盖以下自定义服务事件挂钩:
使用新的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
}
}
使用旧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);
}
}