我正在为servicestack编写一个插件,我想利用服务中内置的error handling。我的想法是我想在处理路由之前执行一些逻辑,并可能返回403错误。我认为这样做的方法是添加RequestFilter
并从其中抛出UnauthorizedAccessException
。
虽然这不起作用,但响应最终为空。看起来通常处理这些的try / catch不适用于RequestFilters
。 DtoUtils
有HandleException()
方法可以创建错误响应,但我不确定如何将其正确添加到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();
答案 0 :(得分:2)
您正在使用请求过滤器,我怀疑您没有正确设置响应。
我建议查看所需角色过滤器的工作原理并编写类似内容。
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();