(System.Web.Http.Filters.ActionFilterAttribute
を使用して)Web APIフィルタを作成しましたが、ASP.Net MVC 4の内部で動作させることができません。RegisterGlobalFilters()
メソッドに追加しようとしましたが、動作しませんでした。グローバルASP.Net Web APIフィルタを追加するには?
ASP.Net MVCでホストされているWeb APIを使用している場合、どのようにフィルタを登録しますか?
(System.Web.Http.Filters.ActionFilterAttribute
を使用して)Web APIフィルタを作成しましたが、ASP.Net MVC 4の内部で動作させることができません。RegisterGlobalFilters()
メソッドに追加しようとしましたが、動作しませんでした。グローバルASP.Net Web APIフィルタを追加するには?
ASP.Net MVCでホストされているWeb APIを使用している場合、どのようにフィルタを登録しますか?
次のコードは、私の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);
}
、正しいクラス名は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
{
...
}
これはすべてのAPIコントローラを継承しますCustomizedApiControllerBase
このアプローチは、global.ascxファイルのグローバルフィルタと比較してより表現力があります。この回答はMVCまでも当てはまること
ノート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つがクラスに継承されます。
誰かがここで何が起こっているのか説明できますか?なぜグローバルフィルタは2組ありますか?それは「グローバル」を矛盾にしていませんか? –
フィルタのセットはMVC用であり、もう1セットはWeb API用です。それらは2つの別々のものであり、通常、一方のフィルタが他方のフィルタに適用されることは望ましくありません。 –
WebApiフィルタが2回呼び出されます。誰かこの問題がありますか? –