2013-02-20 16 views
10

MVC 4 Web APIを使用してアプリケーションのサービスレイヤを作成しています。私はAPIへのすべての着信要求に作用するグローバルフィルタを作成しようとしています。今私は、これは標準のMVCグローバルアクションフィルタとは異なる設定が必要であることを理解しています。しかし私は、私が働くためにオンラインで見つけている例を得ることに問題があります。MVC 4 Web APIレジスタフィルタ

私が遭遇している問題は、Web APIでフィルタを登録することです。

私は私のGlobal.asaxのは、このように設定している...

public class MvcApplication : System.Web.HttpApplication 
{ 
    protected void Application_Start() 
    { 
     AreaRegistration.RegisterAllAreas(); 

     MVCConfig.RegisterRoutes(RouteTable.Routes); 
     MVCConfig.RegisterGlobalFilters(GlobalFilters.Filters); 

     WebApiConfig.RegisterRoutes(GlobalConfiguration.Configuration); 
     WebApiConfig.RegisterGlobalFilters(GlobalConfiguration.Configuration.Filters); 
    } 
} 

私の標準的なMVCのルーティングとフィルタが正しく動作します。私のWebApiルーティングも同様です。ここでは、それは標準のMVC GlobalFilterCollectionに登録されている場合

public class PerformanceTestFilter : ActionFilterAttribute 
{ 
    private readonly Stopwatch _stopWatch = new Stopwatch(); 

    public override void OnActionExecuting(ActionExecutingContext filterContext) 
    { 
     _stopWatch.Reset(); 
     _stopWatch.Start(); 
    } 

    public override void OnActionExecuted(ActionExecutedContext filterContext) 
    { 
     _stopWatch.Stop(); 
     var executionTime = _stopWatch.ElapsedMilliseconds; 
     // Do something with the executionTime 
    } 
} 

このフィルタは正常に動作します... ...私は私のWEBAPIフィルタの登録のために持っているもの

public static void RegisterGlobalFilters(System.Web.Http.Filters.HttpFilterCollection filters) 
{ 
    filters.Add(new PerformanceTestFilter()); 
} 

であり、ここでPerformanceTestFilterですが、 System.Web.Http.Filters.HttpFilterCollectionで登録しようとすると、パラメータ型System.Web.Http.Filters.IFilterに割り当てられないというエラーが表示されます。

私は、WebAPIフィルターとして登録するために、私のPerformanceTestFilterがActionFilterAttribute以外のものから継承する必要があると仮定しています。私はそれが何である必要があるか分かりません。

mvcとwebapiでそれぞれ作業するには、2つの個別のフィルタを作成する必要があると思います。両方に登録できるフィルタを作成する方法があれば、それは素晴らしいことです。しかし、私の主な関心事はwebapiのために働くことです。

ありがとうございました

答えて

10

次のように動作します。実際にはWeb APIプロジェクトにこれを使用しています。あなたは両方のMVCとWebAPIのassembiliesを含むプロジェクトで作業している場合

GlobalConfiguration.Configuration.Filtersは、またタイプのHttpFilterCollection

var filters = System.Web.Http.GlobalConfiguration.Configuration.Filters; 
filters.Clear(); 
filters.Add(new ValidationActionFilterAttribute()); 

public class ValidationActionFilterAttribute : FilterAttribute, IActionFilter, IFilter 
{ 
    ... 
} 

で、あなたの ActionFilterAttributeの名前空間の名前空間だかどうか確認することができます。それは は、両方の下に2つのActionFilterAttributesがあるかなり混乱の原因です:

System.Web.Http.Filters 
    System.Web.Http.Mvc 

出典:Why is my ASP.NET Web API ActionFilterAttribute OnActionExecuting not firing?

それはあなたが二つのフィルタ、API用とMVCのための1つを持っている必要がありますことが表示されます。共通コードを別のクラスに因数分解し、特定のフィルタを使用して共通クラスに呼び出すことで、DRYに違反することなく、本質的に実際のフィルタをフィルタとして登録できるラッパーとして使用できます。

+3

このソリューションは私のプロジェクトをビルドすることを可能にし、標準のMVCアクションフィルタリングのためのWeb APIと "GlobalFilterCollection"の両方に "System.Web.Http.Filters.HttpFilterCollection"の両方にフィルタを登録させました。しかし、私がapiメソッドの1つに移動すると、フィルタは実行されていません。フィルタは、標準のMVCコントローラのアクションで動作しますが、Web APIメソッドでは動作しません。助言がありますか? – jdavis

+0

新しい質問をしてください。コメントに新しい質問をしないでください。 –

+1

@Sam、自分で追加する前にフィルターコレクションをクリアするのはなぜですか? – Vegar

関連する問題