web-dev-qa-db-ja.com

グローバルASP.Net Web Apiフィルターを追加する方法は?

System.Web.Http.Filters.ActionFilterAttribute_を使用して)Web Apiフィルターを作成しましたが、ASP.Net MVC 4内で動作させることができません。RegisterGlobalFilters()メソッドに追加しようとしましたが、それはできませんでした動作しません。

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

96

Global.asaxの次のコードは私のために機能します。

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

protected void Application_Start()
{
  RegisterWebApiFilters(GlobalConfiguration.Configuration.Filters);
}
108
Dave Bettin

この回答は、MVC 5/Web API 2まで当てはまることに注意してください

短い答え: MVCおよびWeb APIフィルターは相互互換性がなく、それらをグローバルに登録する場合は、それぞれに適切な構成クラスを使用する必要があります。

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

Web APIはSystem.Web.Http名前空間の下に存在しますが、MVCはSystem.Web.Mvc名前空間の下に存在します。この2つは喜んで共存しますが、一方にはもう一方が含まれておらず、プログラミングモデルの類似性にもかかわらず、基礎となる実装は異なります。 MVCコントローラーとWeb APIコントローラーが異なるベースコントローラークラスを継承するように(MVCの名前はController、Web APIの名前はApiController)MVCフィルターとWeb APIフィルターは異なるFilterAttributeクラス(この場合、両方とも同じ名前を共有しますが、それぞれの名前空間に存在する別個のクラスです。

WebAPIグローバルフィルターは、WebActivatorでプロジェクトテンプレートを使用している場合、HttpConfigurationメソッドWebApiConfig.csで利用可能なRegisterオブジェクトを通じて登録されます。

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

または、global.asax.csで:

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

Mvcグローバルフィルターは、GlobalFilterCollectionオブジェクトによって登録されます。これは、WebActivatorを使用しているプロジェクトのFilterConfig.csのRegisterGlobalFiltersメソッドを通じて利用できます。

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

または、WebActivatorを使用しない場合のGlobalFilters.Filtersコレクションを介してglobal.asax.csファイルで:

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

どちらの場合も、適切なFilterAttribute型から継承する必要がないことに注意してください。 Web APIフィルターはSystem.Web.Http.IFilterインターフェイスのみを実装する必要がありますが、MVCフィルター登録は、クラスがSystem.Web.Mvc名前空間で定義された少数のフィルターインターフェイスの1つを継承することを確認します。

82
joelmdev

MVC 4 RCでは、正しいクラス名はHttpFilterCollection:です。

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

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

グローバルフィルターを使用する代わりに、私はこれを行うことを好みます:

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

その後、CustomizedApiControllerBaseからすべてのAPIコントローラーを継承します。このアプローチは、global.ascxファイルのグローバルフィルターと比較してより表現力豊かです。

8
Mahmoud Moravej