Asp.net web api 如何在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
[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中没有默认实现