我们一直在使用基于REST的服务ServiceStack有一段时间了,至今它已经达到惊人。
我们所有的服务都被写成:
public class MyRestService : RestService<RestServiceDto>
{
public override object OnGet(RestServiceDto request)
{
}
}
对于每一个DTO我们有响应等价的对象。
public class RestServiceDto
{
public ResponseStatus ResponseStatus {get;set;}
}
它处理所有的异常应该他们抛出。
如果有异常被抛出后来我发现是OnGet()
或OnPost()
方法,那么HTTP状态描述包含异常类在那里,如果我扔了的名字:
new HttpError(HttpStatus.NotFound, "Some Message");
然后HTTP状态描述包含文本“一些信息”。
由于一些其他的服务都抛出异常和其他人投掷new HttpError()
我想知道是否有不改变我所有的REST服务,以捕获任何异常,并抛出一个途径new HttpError()?
因此,举例来说,如果OnGet()
方法抛出一个异常,然后抓住它,并抛出一个new HttpError()
使用旧API - 继承自定义的基类
当你正在使用的旧的API一般地处理异常,你应该提供自定义的基类,覆盖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)
{
}
}
使用新的API - 使用ServiceRunner
否则,如果你正在使用ServiceStack经过改进的新的API ,那么你并不需要将所有服务继承一个基类,而不是你可以告诉ServiceStack通过覆盖CreateServiceRunner使用定制的运行在您的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
}
}