(System.Web.Http.Filters.ActionFilterAttribute
_を使用して)Web Apiフィルターを作成しましたが、ASP.Net MVC 4内で動作させることができません。RegisterGlobalFilters()
メソッドに追加しようとしましたが、それはできませんでした動作しません。
ASP.Net MVCでホストされているWeb Apiを使用している場合、フィルターをどのように登録しますか?
Global.asaxの次のコードは私のために機能します。
public static void RegisterWebApiFilters(System.Web.Http.Filters.HttpFilterCollection filters)
{
filters.Add(new MyWebApiFilter());
}
protected void Application_Start()
{
RegisterWebApiFilters(GlobalConfiguration.Configuration.Filters);
}
この回答は、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つを継承することを確認します。
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);
}
グローバルフィルターを使用する代わりに、私はこれを行うことを好みます:
[MyWebApiFilter]
public class CustomizedApiControllerBase : ApiController
{
...
}
その後、CustomizedApiControllerBase
からすべてのAPIコントローラーを継承します。このアプローチは、global.ascxファイルのグローバルフィルターと比較してより表現力豊かです。