代码之家  ›  专栏  ›  技术社区  ›  Kieran Benton

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

  •  1
  • Kieran Benton  · 技术社区  · 14 年前

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

    不过,我现在已经到了需要为错误条件定义响应的地步。我们正在采用关于HTTP错误代码的标准,但我也很清楚地返回有意义的响应,就像Twitter(REST的永久示例)所做的那样:

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

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

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

    基本上,我想知道这方面的最佳实践是什么,以及其他人是如何处理的。

    谢谢。

    编辑:

    在今天看了一段时间之后,我很难理解如何包装处理程序调用-我已经声明自己是一个OperationInterceptor派生类,并将它与 ResourceSpace.Uses.PipelineContributor<OperationInterceptorContributor>() 并设置自定义依赖项 ResourceSpace.Uses.CustomDependency<IOperationInterceptor, ExceptionHandlerInterceptor>(DependencyLifetime.PerRequest) 但无论我尝试使用哪种方法并用try-catch进行包装,异常仍然是冒泡的。

    它是 RewriteOperation , BeforeExecute AfterExecute 那是最合适的陷阱-如果是的话,你能给我一个如何开始的线索吗?

    谢谢。

    1 回复  |  直到 14 年前
        1
  •  5
  •   SerialSeb    14 年前

    你可以做一些事情来达到你想要的。

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

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

    最后,将该类型注册为不带URI的资源,这样就可以将json编解码器添加到其中

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