使用servicestack捕获异常

时间:2012-10-30 16:28:46

标签: servicestack

我们已经使用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()

1 个答案:

答案 0 :(得分:9)

使用旧API - 继承自定义基类

当你使用旧的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)
   {    
   }
}

使用新API - 使用ServiceRunner

否则,如果您正在使用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
    }
}