5

私たちはRESTベースのサービスにServiceStackをしばらく使用してきましたが、これまでのところ驚くべきことです。

私たちのすべてのサービスは次のように書かれています:

public class MyRestService : RestService<RestServiceDto>
{
   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ステータスの説明に「SomeMessage」というテキストが含まれます。

残りのサービスの一部は例外をスローし、他のサービスはスローしているので、new HttpError()すべてのRESTサービスを変更せずに例外をキャッチしてスローする方法があるかどうか疑問に思いました。new HttpError()?

したがって、たとえば、OnGet()メソッドが例外をスローした場合は、それをキャッチしてnew HttpError()?をスローします。

4

1 に答える 1

9

古いAPIの使用-カスタム基本クラスを継承します

古いAPIを使用して例外を一般的に処理しているため、カスタムベースクラスを提供し、HandleExceptionメソッドをオーバーライドする必要があります。例:

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

次に、カスタムエラー処理を利用するには、代わりにすべてのサービスにクラスを継承させます。例:

public class MyRestService : MyRestServiceBase<RestServiceDto>
{
   public override object OnGet(RestServiceDto request)
   {    
   }
}

新しいAPIの使用-ServiceRunnerを使用します

それ以外の場合、ServiceStackの改善された新しいAPIを使用している場合は、すべてのサービスに基本クラスを継承させる必要はありません。代わりに、CreateServiceRunnerをオーバーライドすることで、AppHostでカスタムランナーを使用するようにServiceStackに指示できます。

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

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
    }
}
于 2012-10-31T04:25:03.430 に答える