1

我正在使用 OpenRasta 2.0 构建一个 REST API,它的可扩展性非常好——例如,我们已经成功地使用 DotNetOpenAuth 轻松地插入了 OAuth 身份验证。

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

{
 "error":"This method requires authentication.",
 "request":"\/1\/statuses\/followers.json"
}

从我们所有的处理程序返回 OperationResult、手动捕获异常并映射到 ResponseResource 的最佳方式是什么?与 OpenRasta 的其他功能相比,这在我看来是相当大的开销。

还是我们应该编写某种贡献者来捕获管道中抛出的异常并全局处理问题?也许只翻译特定类型的异常(RestException?)。

基本上,我对最好的做法是什么以及其他人如何处理它有一种感觉。

谢谢。

编辑:

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

是吗RewriteOperationBeforeExecute或者AfterExecute那是最合适的陷阱 - 如果是的话,你能给我一个关于如何开始的线索吗?

谢谢。

4

1 回答 1

5

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

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

然后,如果您希望它在 json 中序列化,您需要将 operationresult 的 ResponseResource 属性分配给描述您的错误的类型(现在我们称之为“TitsUpResource”)。

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

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

于 2010-11-15T17:16:32.227 回答