(を使用してSystem.Web.Http.Filters.ActionFilterAttribute
)Web APIフィルターを作成しましたが、ASP.Net MVC 4内で機能させることができません。RegisterGlobalFilters()
メソッドに追加しようとしましたが、機能しませんでした。
では、ASP.Net MVCでホストされているWeb APIを使用している場合、どのようにフィルターを登録するのでしょうか。
(を使用して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つは喜んで隣り合って存在しますが、1つはもう1つを含みません。プログラミングモデルの類似性にもかかわらず、基礎となる実装は異なります。MVCコントローラーとWeb APIコントローラーが異なるベースコントローラークラスを継承するのと同じように(MVCは単に名前が付けられController
、Web APIは名前が付けられますApiController
)MVCフィルターとWeb APIフィルターは異なるFilterAttribute
クラスから継承します(この場合、両方とも同じ名前を共有しますが、別々のクラスであり、それぞれの名前空間で)。
WebActivatorでプロジェクトテンプレートを使用している場合HttpConfiguration
、Web APIグローバルフィルターは、Register
メソッドWebApiConfig.cs で使用可能なオブジェクトを通じて登録されます。
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
オブジェクトを使用して登録されます。これはRegisterGlobalFilters
、WebActivatorを使用しているプロジェクトのFilterConfig.cs のメソッドを通じて利用できます。
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つを確実に継承するようにします。
グローバルフィルターを使用する代わりに、私はこれを行うことを好みます:
[MyWebApiFilter]
public class CustomizedApiControllerBase : ApiController
{
...
}
その後、CustomizedApiControllerBase
このアプローチからすべてのAPIコントローラーを継承します。このアプローチは、global.ascxファイルのグローバルフィルターと比較してより表現力があります。