2013-05-06 113 views
1

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

虽然这不起作用,并且响应最终是空的。它看起来像通常处理这些的try/catch不适用于RequestFiltersDtoUtils有一个HandleException()方法创建一个错误响应,但我不知道如何正确地将其添加到RequestFilter收到的IHttpResponse

我想知道是否有另一种方法来添加预路由逻辑,您可以从内部服务中引发异常,或者是否有建议的方式来创建来自RequestFilter的错误响应。通过在服务中抛出的异常返回

编辑

我想通过插件返回匹配错误(尽可能地)的错误。

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

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

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

您有望与请求过滤器,我怀疑你只是没有正确设置响应。

我建议检查一下所需的角色过滤器是如何工作的,并写出类似的东西。

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

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

我试过这个,但是响应与来自服务的正常异常响应非常不同。从jQuery调用时很容易看到这一点,当你这样做时'jqXHR.responseText'是空的。对于正常的ServiceStack异常,responseText包含序列化错误。 – Tyrsius 2013-05-06 17:49:51