从自定义插件处理错误

时间:2013-05-06 17:00:44

标签: servicestack

我正在为servicestack编写一个插件,我想利用服务中内置的error handling。我的想法是我想在处理路由之前执行一些逻辑,并可能返回403错误。我认为这样做的方法是添加RequestFilter并从其中抛出UnauthorizedAccessException

虽然这不起作用,但响应最终为空。看起来通常处理这些的try / catch不适用于RequestFiltersDtoUtilsHandleException()方法可以创建错误响应,但我不确定如何将其正确添加到IHttpResponse收到的RequestFilter

我想知道是否有另一种方法可以添加路由前逻辑,您可以从内部服务中抛出异常,或者如果有建议的方法从RequestFilter创建错误响应。< / p>

修改

我希望插件返回的错误匹配(尽可能接近)服务中抛出的异常返回的错误。

DtoUtils.HandleException看起来像SS构造响应的方式,但当我尝试从插件中调用它时会抛出StackOverflowException

var error = new HttpError(HttpStatusCode.Forbidden, "UnauthorizedAccessException", message);
//_appHost is stored by the original Register() call
var result = DtoUtils.HandleException(_appHost, request, error);
response.WriteToResponse(request, result);
response.EndServiceStackRequest();

2 个答案:

答案 0 :(得分:2)

您正在使用请求过滤器,我怀疑您没有正确设置响应。

我建议查看所需角色过滤器的工作原理并编写类似内容。

https://github.com/ServiceStack/ServiceStack/blob/master/src/ServiceStack.ServiceInterface/RequiredRoleAttribute.cs

res.StatusCode = (int)HttpStatusCode.Forbidden;
res.StatusDescription = "Invalid Role";
res.EndServiceStackRequest();

答案 1 :(得分:0)

我最终使用了这种方法,但我不确定它是最好的方法。它仍然不会检查自定义的全局错误处理程序,这将是理想的。

response.WriteErrorToResponse(request,
                              request.ResponseContentType,
                              request.HttpMethod,
                              message,
                              new UnauthorizedAccessException(message),
                              (int)HttpStatusCode.Forbidden);
response.EndServiceStackRequest();