10

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 で動作させることです。

ありがとう

4

1 に答える 1

10

以下が機能するはずです。実際にこれをWebAPIプロジェクトに使用しています。

GlobalConfiguration.Configuration.FiltersタイプですHttpFilterCollection

 var filters = System.Web.Http.GlobalConfiguration.Configuration.Filters;
 filters.Clear();
 filters.Add(new ValidationActionFilterAttribute());

 public class ValidationActionFilterAttribute : FilterAttribute, IActionFilter, IFilter
 {
    ...
 }

また、MVCとWebAPIの両方のアセンブリを含むプロジェクトで作業している場合は、ActionFilterAttributeの名前空間の名前空間を確認できますか。両方の下に2つのActionFilterAttributesがあるため、かなり混乱します。

  System.Web.Http.Filters
   System.Web.Http.Mvc

ソース:ASP.NET Web API ActionFilterAttribute OnActionExecutingが起動しないのはなぜですか?

API用とMVC用の2つのフィルターが必要になるようです。共通コードを別のクラスに分解し、特定のフィルターを使用して共通クラスを呼び出すことができます。これにより、DRYに違反せず、基本的に実際のフィルターをフィルターとして登録できるラッパーとして使用できます。

于 2013-02-20T14:22:59.930 に答える