与servicestack捕捉异常(Catching exceptions with service

2019-07-03 11:26发布

我们一直在使用基于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()

Answer 1:

使用旧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
    }
}


文章来源: Catching exceptions with servicestack