63

私は MVC 全体に不慣れで、ASP.NET Web API を使用していくつかの WCF サービスを再実装することを検討しています。その一環として、すべてのアクションと例外をログに記録し、タイミングを記録するアクション フィルターを実装したいので、アクション フィルターから始めようと思ったのですが、フィルターが呼び出されていません。

public class MyTrackingActionFilter : ActionFilterAttribute, IExceptionFilter 
{
    private Stopwatch stopwatch = new Stopwatch();

    public void OnException(ExceptionContext filterContext)
    {
           ...
    }

    public override void OnActionExecuted(ActionExecutedContext filterContext)
    {
           ...
    }

    public override void OnActionExecuting(ActionExecutingContext filterContext)
    {
        this.stopwatch.Start();
        Trace.TraceInformation(" Entering {0}", filterContext.RouteData);
    }
}

コントローラーには、

[MyTrackingActionFilter]
public class MyResourceController : ApiController
{
  ...
}

ルートは、次のような呼び出しを使用して Global.asax で設定されます。

var routeTemplate = ...
var defaults = new { controller = controllerName, action = methodName };
var constraints = new { httpMethod = new HttpMethodConstraint(myHTTPMethods.Split(',')) };

routes.MapHttpRoute(methodName, routeTemplate, defaults, constraints);

問題は、MyResourceController のアクションが期待どおりに呼び出され、正常に実行されることです。クライアントはサーバーに必要な情報を問い合わせることができ、アクション フィルター メソッドがまったく呼び出されないことを除いて、すべて正常に動作します。

私の理解では、残りは「自動的に」起こったということでした。それは明らかに十分ではありません - 何が間違っているかについて何か提案はありますか? これらをどこかに登録する必要がありますか?

4

2 に答える 2

189

ActionFilterAttributeコードで、 のSystem.Web.Http.Filters名前空間ではなく、名前空間の を使用していることを確認する必要がありますSystem.Web.Mvc

だから、あなたが持っていることを確認してください

 using System.Web.Http.Filters;
于 2012-04-24T23:40:36.727 に答える
2

Sander が述べたように、私は以下のコードを試しましたが、そのアクション フィルターが実行されています。

public class WebAPIActionFilterAttribute : System.Web.Http.Filters.ActionFilterAttribute
{
    public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
    {
        PersonController.Messages.Add("OnActionExecuted");
    }

    public override void OnActionExecuting(HttpActionContext actionContext)
    {
        PersonController.Messages.Add("OnActionExecuting");
    }
}

public class WebAPIExceptionFilter : System.Web.Http.Filters.ExceptionFilterAttribute
{
    public override void OnException(HttpActionExecutedContext actionExecutedContext)
    {
        PersonController.Messages.Add("OnException");
        actionExecutedContext.Response = new HttpResponseMessage(HttpStatusCode.NotFound) { Content = new StringContent("Something went wrong") };
    }
}

PersonController.Messages は静的な文字列リストです。OnActionExecuted が実行されているかどうかを確認したい場合は、同じ API メソッドをもう一度呼び出すと、メッセージ リストに「OnActionExecuted」が表示されます。

于 2016-08-20T14:58:25.147 に答える