2015-04-07 53 views
3

我有以下的Web API ActionFilterAttribute的WebAPI ActionFilterAttribute OnExecuting不點火

namespace namespace.Filters { 

    using System; 
    using System.Collections.Generic; 
    using System.Linq; 
    using System.Web.Http.Controllers; 
    using System.Web.Http.Filters; 

    public class LogApiRequestActionFilterAttribute : ActionFilterAttribute { 

     public LogApiRequestActionFilterAttribute() { 
     } 

     private void logData(HttpActionContext actionContext) { 
      var controllerName = actionContext.ActionDescriptor.ControllerDescriptor.ControllerType.FullName; 
      var actionName = actionContext.ActionDescriptor.ActionName; 
      var parameters = ""; 

      foreach (var item in actionContext.ActionArguments) { 
       parameters += string.Format("{0} = {1}, ", item.Key, item.Value); 
      } 

      if (parameters.Any()) { 
       parameters = parameters.Remove(parameters.Count() - 2); 
      } 

      var message = string.Format("{0}.{1}({2})", controllerName, actionName, parameters); 
      // Do the logging 
     } 

     public override void OnActionExecuting(HttpActionContext actionContext) { 
      logData(actionContext); 
      base.OnActionExecuting(actionContext); 
     } 
    } 
} 

當我在全球它添加在WebApiConfig.cs這樣的:

config.Filters.Add(new LogApiRequestActionFilterAttribute()); 

logData方法不會被調用。有誰知道爲什麼?

+0

應該將'actionContext'參數的類型改爲'ActionExecutingContext'而不是? – DLeh

+0

@DLeh,這是Visual Studio如何爲我實現接口:) – Knerd

+0

對於一個非常基本的問題感到抱歉,但你怎麼知道它沒有達到那裏? – harishr

回答

3

我才發現我的問題,非常感謝給現在他誰不得命名爲

我的過濾器被正確註冊並且完全加載,只是我正在測試和調試的方法沒有被請求調用。它被剃刀幫手調用,當然,Request-屬性是null

所以修復方法是使用與http request一起調用的操作,而不僅僅是正常的方法調用。

5

你裝飾你的控制器(或任何行動方法),與該過濾器?

例如,

  1. 創建一個名爲LogApiRequestActionFilterAttribute的過濾器後,您需要註冊它(如您所做的那樣)。
  2. 註冊後,如果過濾器必須應用在控制器級別,然後使用該過濾器修飾您的控制器
  3. 如果過濾器具有隻在某些動作方法施加,把過濾器上的特定操作方法(一個或多個)

    [LogApiRequestActionFilter] 
    public class YourController : ApiController 
    { //--->controller level filter 
        [LogApiRequestActionFilter] //-->action level filter 
        public IHttpActionResult DoAction() 
        { 
    
        } 
    
    } 
    
  4. 如果兩者都不工作了,當操作方法執行,放置一個斷點並分析http request。請檢查您的過濾器被登記
+1

我知道,我的錯誤是什麼。你幫了忙。問題是,我正在測試的Controller沒有被請求調用。我只是直接調用它的方法... – Knerd

+0

@Knerd:很高興它幫助:) –

+0

用屬性裝飾控制器做了我的伎倆。非常感謝 – Prabo