gpt4 book ai didi

servicestack - 使用 servicestack 捕获异常

转载 作者:行者123 更新时间:2023-12-04 17:37:43 30 4
gpt4 key购买 nike

一段时间以来,我们一直在将 ServiceStack 用于基于 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() ?

最佳答案

使用旧 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's improved New API那么您不需要让所有服务都继承一个基类,而是可以通过覆盖 CreateServiceRunner 来告诉 ServiceStack 在您的 AppHost 中使用自定义运行器:
public override IServiceRunner<TRequest> CreateServiceRunner<TRequest>(
ActionContext actionContext)
{
return new MyServiceRunner<TRequest>(this, actionContext);
}

MyServiceRunner 只是一个实现您感兴趣的自定义钩子(Hook)的自定义类,例如:
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
}
}

关于servicestack - 使用 servicestack 捕获异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13143502/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com