Ловля исключений с помощью servicetack

Мы уже давно используем ServiceStack для сервисов, основанных на REST, и пока это было удивительно.

Все наши услуги были написаны как:

public class MyRestService : RestService
{
   public override object OnGet(RestServiceDto request)
   {
   }
}

Для каждого DTO у нас есть эквивалентный объект Response:

public class RestServiceDto 
{
    public ResponseStatus ResponseStatus {get;set;}
}

который обрабатывает все исключения, если они будут выброшены.

То, что я заметил, это если исключение выбрасывается вOnGet() или жеOnPost() методы, то описание состояния http содержит имя класса исключения, где, как если бы я бросил:

new HttpError(HttpStatus.NotFound, "Some Message");

тогда описание статуса http содержит текстНекоторое сообщение ".

Так как некоторые из остальных служб выдают исключения, а другие -new HttpError()Мне было интересно, есть ли способ без изменения всех моих служб REST, чтобы перехватить какие-либо исключения и броситьnew HttpError()?

Так, например, еслиOnGet() метод выдает исключение, затем ловит его и выбрасывает?new HttpError()

Ответы на вопрос(1)

Использование старого API - наследовать пользовательский базовый класс

При использовании старого API для обработки исключений в общем случае вы должны предоставить класс Custom Base и переопределить метод HandleException, например:

public class MyRestServiceBase<trequest> : RestService<trequest>
{
   public override object HandleException(TRequest request, Exception ex)
   {
       ...
       return new HttpError(..);
   }
}
</trequest></trequest>

Затем, чтобы воспользоваться преимуществами пользовательской обработки ошибок, пусть все ваши службы наследуют ваш класс, например:

public class MyRestService : MyRestServiceBase<restservicedto>
{
   public override object OnGet(RestServiceDto request)
   {    
   }
}
</restservicedto>
Используя Новый API - используйте ServiceRunner

В противном случае, если выповторное использованиеServiceStack»улучшен новый API тогда ты нене нужно, чтобы все сервисы наследовали базовый класс, вместо этого вы можете просто указать ServiceStack использовать собственный runner в вашем AppHost, переопределив CreateServiceRunner:

public override IServiceRunner<trequest> CreateServiceRunner<trequest>(
    ActionContext actionContext)
{           
    return new MyServiceRunner<trequest>(this, actionContext); 
}
</trequest></trequest></trequest>

Где MyServiceRunner - это просто пользовательский класс, реализующий пользовательские хукизаинтересованы, например, в:

public class MyServiceRunner<t> : ServiceRunner<t> {
    public override object HandleException(IRequestContext requestContext, 
        TRequest request, Exception ex) {
      // Called whenever an exception is thrown in your Services Action
    }
}
</t></t>
 JD.14 нояб. 2012 г., 18:12
Я сделал следующее: защищенный объект переопределения HandleException (запрос TRequest, Exception ex) {_logger.error (ex.message); возврат base.HandleException (request, ex); }
 JD.13 нояб. 2012 г., 13:18
Спасибо за помощь. Тем не менее, как я могу вернуть объекты Response? В настоящее время, если я выдаю ошибку, то объект Response (сериализованный) не возвращается, а с объектом response - нет.

Ваш ответ на вопрос