我正在尝试使用ServiceExceptionHandler延伸的SerivceRestServiceBase<TViewModel>
我可以使用AppHost.ServiceExceptionHandler,这工作正常.我需要来自HttpRequestAppHost级别不可用的用户信息.
所以我正在尝试使用ServiceExceptionHandleron Service级别.虽然我将委托设置为服务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);
};
}
}
Run Code Online (Sandbox Code Playgroud)
我不确定这段代码有什么问题.任何帮助将不胜感激.
在你的AppHost.Configure(),你可以注册一个全球性的异常处理程序:
this.ServiceExceptionHandler = (request, ex) => {
... //handle exception and generate your own ErrorResponse
};
Run Code Online (Sandbox Code Playgroud)
对于更细粒度的Exception处理程序,您可以覆盖以下自定义服务事件挂钩:
如果您正在使用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)
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)
| 归档时间: |
|
| 查看次数: |
1324 次 |
| 最近记录: |