2013-05-02 13 views
10

私は自分のWebAPIアプリケーションにカスタムIHttpActionInvokerを追加して、アクションメソッドで多数の繰り返し例外処理コードを必要としないようにしようとしています。例外ハンドリングのためにWebAPIでカスタムIHttpActionInvokerを使用する

this article以外の方法については実際にはあまりないようです。私のGlobal.asaxファイル内のメソッドに

GlobalConfiguration.Configuration.Services.Remove(typeof(IHttpActionInvoker), 
GlobalConfiguration.Configuration.Services.GetActionInvoker()); 

GlobalConfiguration.Configuration.Services.Add(typeof(IHttpActionInvoker), 
new MyApiControllerActionInvoker()); 

:記事ごとのように私IHttpActionInvokerを書いた後、私はこのコードを追加しました。私のAPIへの呼び出しを実行すると、Remove()メソッドで以下の例外が発生します。

The service type IHttpActionInvoker is not supported 

私は2つの質問があると思います。

  1. カスタムIHttpActionInvokerクラスを書くことについてそこに非常に多くがあるように見られていません考えると、これはWebAPIのアプリケーションで例外処理を解決するための良い方法を検討していますか?

  2. Remove()メソッドを実行するときにこのような例外が発生する理由と、この特定の問題を解決する最善の方法を知っている人はいますか?

答えて

7

サービスの削除時に同じエラーが発生しました。

コンテナにインターフェイスを登録してから最初に解決すると表示されるので、グローバル設定から何も削除する必要はないことがわかりました。

は例えば、私はSimpleInjectorを使用していて、私のGlobal.asaxの中で私がこの持っている:必要なときに実行時に

container.Register<IHttpActionInvoker , MyApiControllerActionInvoker >(); 
// Register the dependency resolver. 
GlobalConfiguration.Configuration.DependencyResolver = 
    new SimpleInjectorWebApiDependencyResolver(container); 

が、それはMyApiControllerActionInvoker依存性を解決しています。

お客様のActionInvokerで例外処理を実行することができ、コンストラクタで設定された依存関係は正しく配線されます。私がActionInvokerを見ていた理由は、コンストラクタインジェクションを取得することでした。アトリビュートに注入するとプロパティ注入が必要なように見えるからです。

削除/挿入ではなく、置き換えも機能するようです。 (Global.asax内)

GlobalConfiguration.Configuration.Services.Replace(typeof(IHttpActionInvoker), new MyApiControllerActionInvoker(fooService)); 
+0

私はフィルターに行くことになったが、これは知っていることは非常に良いです! – Jammer

1

代わりに例外フィルタの登録を検討しましたか?ここではそれについていくつかのドキュメントです:

http://www.asp.net/web-api/overview/web-api-routing-and-actions/exception-handling

あなたがしたいすべてが特定の方法でいくつかの例外を処理している場合は、アクションの呼び出し層に落下する必要はありません。

+1

キャプチャしたい例外の多くは、Web APIによって「HttpResponseException」に変換されます。この例外は、例外フィルタが呼び出されるまで待たされているため、グローバル例外フィルタはすべてを取得することはありません。 –

0

私の場合、IHttpActionInvokerではなくIActionInvokerで動作します。私が理解しているように、IHttpActionInvokerは非同期API呼び出しに使用されますか?

public class RepControllerActionInvoker : ControllerActionInvoker 
{ 
    ILogger _log; 

    public RepControllerActionInvoker() 
     : base() 
    { 
     _log = DependencyResolver.Current.GetService<ILogger>(); 
    } 

    public override bool InvokeAction(ControllerContext controllerContext, string actionName) 
    { 
     try 
     { 
      return base.InvokeAction(controllerContext, actionName); 
     } 
     catch (Exception e) 
     { 
      _log.Error(e); 
      throw new HttpException(500, "Internal error"); 
     } 
    } 
} 
関連する問題