在OpenRasta处理程序中处理异常时,转换为响应的最佳方法是什么?

Kie*_*ton 1 c# rest exception-handling openrasta

我正在使用OpenRasta 2.0来构建REST API,并且它的可扩展性非常棒 - 例如,我们已经使用DotNetOpenAuth轻松地插入OAuth身份验证.

但是我现在已经到了我需要定义错误条件响应的地步.我们正在采用有关HTTP错误代码的标准 - 但我也很有意义地返回有意义的响应,就像Twitter(REST的常年示例)那样:

{
 "error":"This method requires authentication.",
 "request":"\/1\/statuses\/followers.json"
}
Run Code Online (Sandbox Code Playgroud)

是从所有处理程序返回OperationResult的最佳方法,手动捕获异常并映射到ResponseResource?与OpenRasta的其余功能相比,在我看来这是一个相当大的开销.

或者我们应该写一些贡献者来捕获管道中抛出的异常并全局处理问题?也许只翻译特定类型的异常(RestException?).

基本上我是在感觉最好的做法是什么以及其他人如何处理它.

谢谢.

编辑:

今天看了一段时间之后,我无法弄清楚如何包装处理程序调用 - 我已经宣布自己是一个OperationInterceptor派生类并且已经将它连接到管道中ResourceSpace.Uses.PipelineContributor<OperationInterceptorContributor>()并设置了自定义依赖关系,ResourceSpace.Uses.CustomDependency<IOperationInterceptor, ExceptionHandlerInterceptor>(DependencyLifetime.PerRequest)但无论在哪个我尝试并在try-catch中包装的方法,异常仍然是气泡.

RewriteOperation,BeforeExecute或者AfterExecute这是最适合陷阱的地方 - 如果可以,你能给我一个如何开始的线索吗?

谢谢.

Ser*_*Seb 5

你可以做几件事来实现你想要的.

首先,您可以构建一个IOperationInterceptor,它在try/catch块中包装对处理程序的调用,并在ICommunicationContext上分配正确的OperationResult.

然后,如果您希望在json中对其进行序列化,则需要将operationresult的ResponseResource属性分配给描述错误的类型(现在让我们将其称为"TitsUpResource").

最后,将该类型注册为没有URI的资源,因此您可以将json编解码器添加到其中

ResourceSpace.Has.ResourcesOfType().WithoutUri.TranscodedBy或您可能想要的任何其他内容.