我使用OpenRasta 2.0构建了一个REST,它的扩展性非常棒--例如,我们已经成功地使用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中包装哪种方法,异常仍然是泡影。
是RewriteOperation,BeforeExecute还是AfterExecute是最合适的陷阱--如果是的话,你能给我一个如何开始的线索吗?
谢谢。
发布于 2010-11-15 17:16:32
为了达到你想要的目的,你可以做几件事。
首先,您可以构建一个IOperationInterceptor,它将对处理程序的调用封装在try/catch块中,并在ICommunicationContext上分配正确的OperationResult。
然后,如果您希望在json中序列化它,您将希望将操作结果的ResponseResource属性分配给描述错误的类型(现在我们称之为"TitsUpResource“)。
最后,将该类型注册为没有URI的资源,这样就可以将json编解码器添加到其中。
ResourceSpace.Has.ResourcesOfType().WithoutUri.TranscodedBy或者其他你想要的东西。
https://stackoverflow.com/questions/4186306
复制相似问题