2010-11-15 43 views
1

我正在使用OpenRasta 2.0來構建REST API,並且其可擴展性非常好 - 我們已經管理好了例如使用DotNetOpenAuth非常輕鬆地插入OAuth身份驗證。在處理OpenRasta處理程序中的異常時,轉換爲響應的最佳方式是什麼?

但是我現在已經到了需要爲錯誤條件定義我們的響應的地步。我們正在通過有關HTTP錯誤代碼標準 - 但我Concious酒店返回有意義的反應,以及,非常像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中包裝哪些方法,異常仍然會冒泡。

是否RewriteOperationBeforeExecuteAfterExecute這是最合適的地方陷阱 - 如果是的話,你可以給我一個線索如何開始?

謝謝。

+1

不要添加OperationInterceptorContributor,沒有必要這樣做。您可以將操作攔截器添加爲方法的屬性,或者希望處理函數的處理程序,或者僅在IoC容器中爲IOperationInterceptor接口註冊攔截器(並使其成爲瞬態),然後完成操作,您可以在您選擇的IoC中或通過.Has.CustomDependency方法執行此操作。 – SerialSeb 2010-11-17 14:08:02

+1

似乎我錯過了那一個。它在重寫中,將try/catch中的原始調用(傳遞給重寫方法的委託)包裝起來。 – SerialSeb 2011-02-23 15:09:19

回答

5

有幾件事情可以做到,以達到你想要的。

首先,您可以構建一個IOperationInterceptor,它將對調用程序的調用封裝在try/catch塊中,並在ICommunicationContext上分配正確的OperationResult。

然後,如果你希望這個在json中被序列化,你需要將你的operationresult的ResponseResource屬性分配給描述你的錯誤的類型(我們現在稱之爲「TitsUpResource」)。

最後,註冊該類型沒有URI的資源,這樣你就可以在JSON編解碼器添加到它

ResourceSpace.Has.ResourcesOfType()。WithoutUri.TranscodedBy或任何其他你可能希望。

+0

洛爾傑出的答案,謝謝Seb - 誰比誰更好地得到它自己。 +1特別是對於TitsUpResource! – 2010-11-16 11:34:24

+0

你介意在我的編輯中看看我的進一步問題嗎?我無法繼續工作。謝謝。 – 2010-11-16 19:03:46

+0

如何在'IOperationInterceptor'中設置OperationResult時執行HTTP響應的'StatusCode'?對我來說,它只是恢復到200. – 2011-07-07 14:55:19

相關問題