2012-03-01 6 views
83

System.Web.Http.Filters.ActionFilterAttributeを使用して)Web APIフィルタを作成しましたが、ASP.Net MVC 4の内部で動作させることができません。RegisterGlobalFilters()メソッドに追加しようとしましたが、動作しませんでした。グローバルASP.Net Web APIフィルタを追加するには?

ASP.Net MVCでホストされているWeb APIを使用している場合、どのようにフィルタを登録しますか?

答えて

94

次のコードは、私のGlobal.asaxの中で、私の作品:MVC 4 RCのよう

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

protected void Application_Start() 
{ 
    RegisterWebApiFilters(GlobalConfiguration.Configuration.Filters); 
} 
+6

誰かがここで何が起こっているのか説明できますか?なぜグローバルフィルタは2組ありますか?それは「グローバル」を矛盾にしていませんか? –

+5

フィルタのセットはMVC用であり、もう1セットはWeb API用です。それらは2つの別々のものであり、通常、一方のフィルタが他方のフィルタに適用されることは望ましくありません。 –

+2

WebApiフィルタが2回呼び出されます。誰かこの問題がありますか? –

11

、正しいクラス名はHttpFilterCollectionです:

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

protected void Application_Start() 
{ 
    RegisterWebApiFilters(GlobalConfiguration.Configuration.Filters); 
} 
4

の代わりに使用してグローバルフィルター私はこれを行うことを好む:

[MyWebApiFilter] 
public class CustomizedApiControllerBase : ApiController 
{ 
    ... 
} 

これはすべてのAPIコントローラを継承しますCustomizedApiControllerBase このアプローチは、global.ascxファイルのグローバルフィルタと比較してより表現力があります。この回答はMVCまでも当てはまること

62

ノート5 /ウェブAPI 2

短い答え: MVCとWeb APIフィルターは互換性の交差されていない、とあなたが世界的にそれらを登録したい場合は、あなたがしなければなりませんそれぞれに適切な構成クラスを使用してください。

長い答え: ASP.NET MVCとWeb APIは意図的に同様の方法で動作するように設計されていますが、実際は別の生き物です。

ウェブAPIはSystem.Web.Http名前空間の下にありますが、MVCはSystem.Web.Mvc名前空間の下に存在します。 2人は喜んで一緒に暮らしていますが、もう一方は含まれておらず、プログラミングモデルの類似点にもかかわらず、基本的な実装は異なります。 MVCコントローラとWeb APIコントローラは異なるベースコントローラクラス(MVCの名前はController、Web APIの名前はApiController)を継承するのと同じように、MVCフィルタとWeb APIフィルタは異なるFilterAttributeクラスから継承しますそれぞれの名前空間にあるクラス)。 Global.asaxの中

public static void Register(HttpConfiguration config) 
{ 
    //stuff before 
    config.Filters.Add(new MyWebApiFilter()); 
    //stuff after 
} 

またはその他:あなたがWebActivatorとのプロジェクトテンプレートを使用している場合

ウェブAPIグローバルフィルタはRegister方法WebApiConfig.csで使用可能なHttpConfigurationオブジェクトを介して登録されています。 CS:

GlobalConfiguration.Configuration.Filters.Add(new MyWebApiFilter()); 

MVCグローバルフィルタは、プロジェクトのためFilterConfig.csのRegisterGlobalFilters方法を介してユーザーに提供されていますGlobalFilterCollectionオブジェクトの仕方によって登録されていますWebActivator:

public class FilterConfig 
{ 
    public static void RegisterGlobalFilters(GlobalFilterCollection filters) 
    { 
     //stuff before 
     filters.Add(new MyMvcFilter()); 
     //stuff after 
    } 
} 

またはglobal.asaxを使用しています。WebActivatorない人のためのGlobalFilters.Filters収集の方法により、CSファイル:

GlobalFilters.Filters.Add(new MyMvcFilter()); 

それは両方のケースでは、あなたが適切なFilterAttributeタイプから継承する必要がないことは注目に値します。 Web APIフィルタはSystem.Web.Http.IFilterインターフェイスのみを実装する必要があり、MVCフィルタ登録チェックでは、System.Web.Mvc名前空間で定義されたいくつかのフィルタインターフェイスの1つがクラスに継承されます。

+0

webapiconfig.csでカスタムWeb APIフィルタを追加すると、私のために動作します。私はなぜglobal.asax.csに追加されたときにうまくいかなかったのか分かりません。 – Tatipaka

+0

@tatipakaに感謝します。 webapiconfigに追加されました。 – Gokulnath

関連する問題