Asp.net web api 如何在Web API中获取动作过滤器中的控制器值

Asp.net web api 如何在Web API中获取动作过滤器中的控制器值,asp.net-web-api,asp.net-web-api2,Asp.net Web Api,Asp.net Web Api2,我正在使用以下代码在Web API中执行审核功能: [HttpGet] public IHttpActionResult GetList() { //var dd = ((ClaimsIdentity) User.Identity).Claims.FirstOrDefault(x => x.Type == "UserId").Value; AuditBAL auditBAL = new AuditBAL(); Aud

我正在使用以下代码在Web API中执行审核功能:

   [HttpGet]
    public IHttpActionResult GetList()
    {
        //var dd = ((ClaimsIdentity) User.Identity).Claims.FirstOrDefault(x => x.Type == "UserId").Value;

        AuditBAL auditBAL = new AuditBAL();

        Audit audit = new Audit();
        audit.TableName = TableName.Terms_TABLE;
        audit.MenuId = Convert.ToInt64(PageEnum.Terms);
        audit.ActionId = Convert.ToInt64(ActionEnum.List);
        audit.UserId = Convert.ToInt64(((ClaimsIdentity) User.Identity).Claims.FirstOrDefault(x => x.Type == "UserId").Value);

        auditBAL.Save(audit);

        return Ok(new ResponceView<DataTable>()
        {
            ResponseObject = termBAL.GetList()
        });
    }
[HttpGet]
公共IHttpActionResult GetList()
{
//var dd=((ClaimsIdentity)User.Identity).Claims.FirstOrDefault(x=>x.Type==“UserId”).Value;
AuditBAL AuditBAL=新的AuditBAL();
审计=新审计();
audit.TableName=TableName.Terms\u TABLE;
audit.MenuId=Convert.ToInt64(PageEnum.Terms);
audit.ActionId=Convert.ToInt64(ActionEnum.List);
audit.UserId=Convert.ToInt64(((ClaimsIdentity)User.Identity).Claims.FirstOrDefault(x=>x.Type==“UserId”).Value);
审核保存(审核);
返回Ok(新建ResponceView()
{
ResponseObject=termBAL.GetList()
});
}
使用上述方法,我可以审核所有事件,但我必须为所有控制器方法编写上述代码审核代码

我希望它对所有方法都是通用的,所以我在WebAPI中使用ActionFilter,但我不知道如何在ActionFilter中获取passAudit对象,或者如何在ActionFilter中获取方法名和控制器名。一旦我在行动中获得必要的信息,我就可以使用这些信息进行审计

我想对异常过滤器做同样的事情(想在异常过滤器中获得方法名和控制器名)

提前感谢。


如何在Action Filter和中获取方法名和控制器名 异常过滤器



您关于使用ActionFilter的决定很好。问题是决定在调用(OnActionExecuting)操作名称之前(OnActionExecuted)或之后(OnActionExecuted)将审计调用放在何处。这是您必须根据需要做出的技术决策

过滤器类:

    public class AuditFilter : ActionFilterAttribute
    {
        public override void OnActionExecuting(HttpActionContext actionContext)
        {
            var controllerName = actionContext.ControllerContext.ControllerDescriptor.ControllerName;
            var actionName = actionContext.ActionDescriptor.ActionName;
            var auditRepository = SvcLocator.GetInstance<IAuditRepository>();
            auditRepository.SaveAudit(controllerName, actionName);
        }

        public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
        {
            var controllerName = actionExecutedContext.ActionContext.ControllerContext.ControllerDescriptor.ControllerName;
            var actionName = actionExecutedContext.ActionContext.ActionDescriptor.ActionName;
            var auditRepository = SvcLocator.GetInstance<IAuditRepository>();
            auditRepository.SaveAudit(controllerName, actionName);
        }
    }
 [AuditFilter]
 public class ChatroomController : ApiController
 {...
  public class AuditRepository : IAuditRepository
  {
      public void SaveAudit(string controllerName, string actionName)
      {
          var auditEntity = new AuditEntity()
            {
                TableName = "Customer",
                ManuId = "Shopping",
                ControllerId = controllerName,
                ActionId = actionName
            };

            //Save into database here
        }
    }
新组件:

    public class AuditFilter : ActionFilterAttribute
    {
        public override void OnActionExecuting(HttpActionContext actionContext)
        {
            var controllerName = actionContext.ControllerContext.ControllerDescriptor.ControllerName;
            var actionName = actionContext.ActionDescriptor.ActionName;
            var auditRepository = SvcLocator.GetInstance<IAuditRepository>();
            auditRepository.SaveAudit(controllerName, actionName);
        }

        public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
        {
            var controllerName = actionExecutedContext.ActionContext.ControllerContext.ControllerDescriptor.ControllerName;
            var actionName = actionExecutedContext.ActionContext.ActionDescriptor.ActionName;
            var auditRepository = SvcLocator.GetInstance<IAuditRepository>();
            auditRepository.SaveAudit(controllerName, actionName);
        }
    }
 [AuditFilter]
 public class ChatroomController : ApiController
 {...
  public class AuditRepository : IAuditRepository
  {
      public void SaveAudit(string controllerName, string actionName)
      {
          var auditEntity = new AuditEntity()
            {
                TableName = "Customer",
                ManuId = "Shopping",
                ControllerId = controllerName,
                ActionId = actionName
            };

            //Save into database here
        }
    }
注意:

    public class AuditFilter : ActionFilterAttribute
    {
        public override void OnActionExecuting(HttpActionContext actionContext)
        {
            var controllerName = actionContext.ControllerContext.ControllerDescriptor.ControllerName;
            var actionName = actionContext.ActionDescriptor.ActionName;
            var auditRepository = SvcLocator.GetInstance<IAuditRepository>();
            auditRepository.SaveAudit(controllerName, actionName);
        }

        public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
        {
            var controllerName = actionExecutedContext.ActionContext.ControllerContext.ControllerDescriptor.ControllerName;
            var actionName = actionExecutedContext.ActionContext.ActionDescriptor.ActionName;
            var auditRepository = SvcLocator.GetInstance<IAuditRepository>();
            auditRepository.SaveAudit(controllerName, actionName);
        }
    }
 [AuditFilter]
 public class ChatroomController : ApiController
 {...
  public class AuditRepository : IAuditRepository
  {
      public void SaveAudit(string controllerName, string actionName)
      {
          var auditEntity = new AuditEntity()
            {
                TableName = "Customer",
                ManuId = "Shopping",
                ControllerId = controllerName,
                ActionId = actionName
            };

            //Save into database here
        }
    }
  • 由于您需要对所有控制器的所有操作进行审核,因此该属性必须放置在控制器级别,以便所有操作都将执行筛选
  • 运行base.OnActionExecuted在这里没有任何意义,因为netframework中没有默认实现