WebAPI ActionFilterAttribute OnExecuting not firing

时间:2015-04-07 15:55:01

标签: asp.net-mvc asp.net-web-api

我有以下Web API ActionFilterAttribute

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方法永远不会被调用。有谁知道为什么?

2 个答案:

答案 0 :(得分:5)

您是否使用该过滤器装饰了控制器(或任何操作方法)?

例如

  1. 创建名为LogApiRequestActionFilterAttribute的过滤器后,您需要注册它(就像您所做的那样)。
  2. 注册后,如果必须在控制器级别应用过滤器,则使用该过滤器装饰您的控制器
  3. 如果必须仅在特定操作方法上应用过滤器,将过滤器放在该特定操作方法上

    [LogApiRequestActionFilter]
     public class YourController : ApiController
     { //--->controller level filter
        [LogApiRequestActionFilter] //-->action level filter
        public IHttpActionResult DoAction()
        {
    
        }
    
     }
    
  4. 如果它们都没有运行,则在执行操作方法时,输入断点并分析http request。检查您的过滤器是否已注册

答案 1 :(得分:3)

我刚刚发现了我的问题,非常感谢现在他不能被命名为

我的过滤器已正确注册并且也完美加载,只是我正在测试和调试的方法,没有被请求调用。它是从一个剃刀助手调用的,Request - 属性当然是null

所以修复是使用一个用http request调用的动作,而不仅仅是普通的方法调用。