4

各アクションのロード時にリクエストからいくつかのものをプルする単純なフィルターの作成を開始し、次のような他のスタックオーバーフローからいくつかのコードをコピーしました。

public class TestKeyAttribute : ActionFilterAttribute
{
    public override void OnActionExecuting(HttpActionContext context)
    {
        if (context.Request.Properties.ContainsKey("test"))
        {
        // do stuff
        }
    }
}

次に、残りの属性を追加しました。

public static void RegisterGlobalFilters(GlobalFilterCollection filters)
{
    GlobalConfiguration.Configuration.Filters.Add(new ElmahHandledErrorLoggerFilter());
    filters.Add(new HandleErrorAttribute());
    filters.Add(new TestKeyAttribute());
}

実行すると、次のエラーが発生します。

The given filter instance must implement one or more of the following filter
interfaces: IAuthorizationFilter, IActionFilter, IResultFilter, IExceptionFilter.

私が見つけたリンクのほとんどは MVC 3 に関連しており、これは機能しているようです。しかし、私は MVC 4 と Web API を使用しています - 今すぐ属性を登録する必要がある他の方法はありますか?

注意: フィルターを Web API コントローラーにアタッチするのではなく (ただし、GlobalConfiguration.Configuration.Filters に追加すると機能します)、通常の Web コントローラーにアタッチします。

編集:代わりに IActionFilter から継承し、OnActionExecuting を使用することでこれを機能させることができることを知っています。チュートリアルの束がそうすべきだと言っているように見えるので、なぜこのアプローチが機能しないのか不思議です。

4

3 に答える 3

7

私は同じエラーがあり、ElmahHandledErrorLoggerFilter実装するのと同じように戸惑いましIExceptionFilterた。

調査の後、私は自分自身を蹴りfilters.Add(new ElmahHandledErrorLoggerFilter());、 FilterConfig クラスの下の MVC サイト構成に追加しました。config.Filters.Add(new ElmahHandleErrorApiAttribute());代わりに WebApiConfig クラスに追加すると機能します。

注: ここでは WebAPI v1 を使用していますが、同じ方法で v2 プロジェクトを構成しました。

于 2015-09-11T08:13:05.630 に答える
3

これが機能しない理由は、フィルターが WebAPI フィルターであり、Mvc フィルターと交換できないためです。Mvc と WebAPI の FilterAttribute および関連するクラスとインターフェイスには、多くの同じ名前があります (これが、チュートリアルでこれが機能すると述べているように見える理由です) が、それらは異なる名前空間に存在します。Mvc フィルター クラスは にSystem.Web.Mvcあり、WebAPI クラスは にありSystem.Web.Httpます。

ここでさらに読む:https://stackoverflow.com/a/23094418/22392

于 2014-12-04T15:42:32.873 に答える
1

MVC4 を使用する場合、カスタム属性が存在するプロジェクトには、System.Web.Http.Common ライブラリへの参照が含まれている必要があります。NuGet を使用してプロジェクトに追加しました。エラーはなくなります。

于 2013-06-10T23:01:16.700 に答える