2012-04-24 16 views
48

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

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); 
    } 

}

等コントローラで、Iは

[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のアクションは、期待通りに起動され、正常に実行されます。クライアントは、必要な情報をサーバに問い合わせることができ、すべての動作フィルタメソッドが呼び出されることを除いて、すべて正常に動作します。

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

+0

注:操作とクラスの両方に属性を追加しようとしましたが、いずれの方法も機能しませんでした。 – WildeButNotOscar

+0

あなたのAPIコントローラ関連のクラスがSystem.Web.HttpFiltersのActionFilterを使用し、System.Web.MvcのActionFiltersを使用していないことを100%確信してください。 –

+0

トップでは、System.Web.HttpFiltersを使用してください。 –

答えて

169

あなたはあなたのコードがSystem.Web.Mvcから1をSystem.Web.Http.Filters名前空間からActionFilterAttributeを使用しないように注意してくださいする必要があります。

だから、サンダーは、私はそのアクションフィルタが実行取得され、以下のコードを試してみまし述べたように、あなたが

using System.Web.Http.Filters; 
+0

imはすべての要求をログに記録し、それらを分析しようとしていますか?この質問と私の必要性についてのこの答えですか?そうであれば?どうやって ?それをしてもいいですか? –

+1

@sabertabatabaeeyazdiログにアクションフィルターを使用する – dotnetguy

+0

Mvcアプリケーションをビルドする場合はSystem.Web.Mvc、Web Apiを構築する場合はSystem.Web.Http.Filtersを使用してください(ApiControllerから継承したコントローラー) – suhendri

0

を持っていることを確認してください。

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メソッドを再度呼び出すと、Messagesリストに "OnActionExecuted"が表示されます。