MVC 4 Web API を使用して、アプリケーションのサービス レイヤーを作成しています。API へのすべての着信要求に作用するグローバル フィルターを作成しようとしています。これで、標準の MVC グローバル アクション フィルターとは異なる方法で構成する必要があることがわかりました。しかし、オンラインで見つけた例を機能させるのに問題があります。
私が直面している問題は、フィルターを Web API に登録することです。
Global.asax をこのように設定しています...
public class MvcApplication : System.Web.HttpApplication
{
protected void Application_Start()
{
AreaRegistration.RegisterAllAreas();
MVCConfig.RegisterRoutes(RouteTable.Routes);
MVCConfig.RegisterGlobalFilters(GlobalFilters.Filters);
WebApiConfig.RegisterRoutes(GlobalConfiguration.Configuration);
WebApiConfig.RegisterGlobalFilters(GlobalConfiguration.Configuration.Filters);
}
}
標準の Mvc ルーティングとフィルターは正しく機能します。私の WebApi ルーティングも同様です。これが私のwebApiフィルター登録用のものです...
public static void RegisterGlobalFilters(System.Web.Http.Filters.HttpFilterCollection filters)
{
filters.Add(new PerformanceTestFilter());
}
そして、ここに PerformanceTestFilter があります...
public class PerformanceTestFilter : ActionFilterAttribute
{
private readonly Stopwatch _stopWatch = new Stopwatch();
public override void OnActionExecuting(ActionExecutingContext filterContext)
{
_stopWatch.Reset();
_stopWatch.Start();
}
public override void OnActionExecuted(ActionExecutedContext filterContext)
{
_stopWatch.Stop();
var executionTime = _stopWatch.ElapsedMilliseconds;
// Do something with the executionTime
}
}
このフィルターは、標準の Mvc GlobalFilterCollection に登録すると正常に動作しますが、System.Web.Http.Filters.HttpFilterCollection に登録しようとすると、パラメーター タイプ System.Web.Http に割り当てできないというエラーが表示されます。 Filters.IFilter.
したがって、WebAPI フィルターとして登録するには、PerformanceTestFilter が ActionFilterAttribute 以外のものから継承する必要があると想定しています。それが何である必要があるのか わかりません。
mvc と webapi をそれぞれ操作するには、2 つの個別のフィルターを作成する必要があると思います。両方に登録できるフィルターを作成する方法があれば、それは素晴らしいことです。しかし、私の主な関心事は、単に webapi で動作させることです。
ありがとう