При обработке исключений в обработчиках OpenRasta, каков наилучший способ преобразования в ответ? - PullRequest
1 голос
/ 15 ноября 2010

Я использую OpenRasta 2.0 для создания REST API, и его расширяемость просто фантастическая - нам удалось, например, безболезненно подключить аутентификацию OAuth с использованием DotNetOpenAuth.

Однако я пришел кТеперь укажите, где мне нужно определить наши ответы на ошибки.Мы принимаем стандарты в отношении кодов ошибок 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, исключение все еще пузырится.

Isэто RewriteOperation, BeforeExecute или AfterExecute, которое является наиболее подходящим местом для ловушки - и если да, то можете ли вы дать мне подсказку, как начать?

Спасибо.

1 Ответ

5 голосов
/ 15 ноября 2010

Есть пара вещей, которые вы можете сделать, чтобы достичь того, что вы хотите.

Во-первых, вы можете создать IOperationInterceptor, который оборачивает вызов вашего обработчика в блок try / catch, и назначить правильный OperationResult в ICommunicationContext.

Тогда, если вы хотите, чтобы это было сериализовано в json, вам нужно присвоить свойству ResponseResource вашего результата операции тип, который описывает вашу ошибку (назовем сейчас это "TitsUpResource").

Наконец, зарегистрируйте этот тип как ресурс без URI, чтобы вы могли добавить к нему кодек json

ResourceSpace.Has.ResourcesOfType (). Без Uri.TranscodedBy или чего-либо еще, что вы можете захотеть.

...