我们已经使用ServiceStack for REST服务了一段时间,到目前为止它已经很棒了。
我们所有的服务都写成:
public class MyRestService : RestService<RestServiceDto>
{
public override object OnGet(RestServiceDto request)
{
}
}
对于每个DTO,我们都有Response等效对象:
public class RestServiceDto
{
public ResponseStatus ResponseStatus {get;set;}
}
如果被抛出则处理所有异常。
我注意到如果在OnGet()
或OnPost()
方法中抛出异常,那么http状态描述包含异常类的名称,就好像我扔了一样:
new HttpError(HttpStatus.NotFound, "Some Message");
然后http状态描述包含文本“Some Message”。
由于其他一些服务正在抛出异常而其他服务正在抛出new HttpError()
,我想知道是否有办法在不更改所有REST服务的情况下捕获任何异常并抛出new HttpError()?
例如,如果OnGet()
方法抛出异常,那么抓住它并抛出new HttpError()
?
答案 0 :(得分:9)
当你使用旧的API来处理异常时,你应该提供一个Custom Base类并覆盖HandleException方法,例如:
public class MyRestServiceBase<TRequest> : RestService<TRequest>
{
public override object HandleException(TRequest request, Exception ex)
{
...
return new HttpError(..);
}
}
然后,为了利用自定义错误处理,您的所有服务都会继承您的类,例如:
public class MyRestService : MyRestServiceBase<RestServiceDto>
{
public override object OnGet(RestServiceDto request)
{
}
}
否则,如果您正在使用ServiceStack's improved New API,那么您不需要让所有服务都继承基类,而是可以通过覆盖CreateServiceRunner告诉ServiceStack在AppHost中使用自定义运行器:
public override IServiceRunner<TRequest> CreateServiceRunner<TRequest>(
ActionContext actionContext)
{
return new MyServiceRunner<TRequest>(this, actionContext);
}
MyServiceRunner只是一个实现你感兴趣的自定义钩子的自定义类,例如:
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
}
}