一:正文
前言:有很多时候,我们在调用webApi时候,需要对执行的方法做统一的处理,例如在调用API结束后需要更新执行状态和最后执行时间,可以在方法前标记一个特征,这样有这个特征的方法都会去调用这个方法。
二:直接上代码
1.写一个类,然后继承 ActionFilterAttribute,重写 OnActionExecuting(执行方法前)/OnActionExecuted(执行方法后)方法
public class TaskApiFilter : ActionFilterAttribute
{
//执行方法之前的页面
public override void OnActionExecuting(HttpActionContext actionContext)
{
base.OnActionExecuting(actionContext);
//获取请求参数
TaskApiModels model = new TaskApiModels();
Dictionary<string, object> dic = actionContext.ActionArguments;
foreach (string key in dic.Keys)
{
model = (TaskApiModels)dic[key];
//TODO: 业务判断
if (!string.IsNullOrEmpty(model.TaskId)) //获取到任务号
{
//执行业务方法
}
}
}
/// <summary>
/// 执行方法之后的页面
/// </summary>
/// <param name="HttpActionExecutedContext"></param>
public override void OnActionExecuted(HttpActionExecutedContext HttpActionExecutedContext)
{
base.OnActionExecuted(HttpActionExecutedContext);
TaskApiModels model = new TaskApiModels();
Dictionary<string, object> dic = HttpActionExecutedContext.ActionContext.ActionArguments;
foreach (string key in dic.Keys)
{
model = (TaskApiModels)dic[key];
//TODO: 业务判断
if (!string.IsNullOrEmpty(model.TaskId)) //获取到任务号
{
//更新执行时间
updateTaskApiStatus(model.TaskId, 1);
}
}
}
/// <summary>
/// 更新任务状态
/// </summary>
/// <param name="TaskId"></param>
/// <param name="TaskType">1 成功 0 失败 </param>
public void updateTaskApiStatus(string TaskId, int TaskType)
{
}
}
2.给需要更新的方法打上特征,给方法打上特征后,就会去执行特征定义的操作
public class OrderInfoController : ApiController
{
/// <summary>
/// 会员权益计算
/// </summary>
/// <returns></returns>
[HttpPost]
[TaskApiFilter] //给执行的方法打上特征
public dynamic HYQYJS(TaskApiModels TaskApiModels)
{
//具体业务
return GenRet.Msg("success");
}
}
3.优化写法,由于每个方法都需要标记特征,觉得很烦,定义一个控制器,然后去集成这个控制器,这样就完美了。
第一步,写一个控制器继承ApiController
[TaskApiFilter]
public class TaskApiController : ApiController //继承ApiController
{
}
第二步,继承TaskApiController
public class OrderInfoController : TaskApiController//继承TaskApiController
{
/// <summary>
/// 会员权益计算
/// </summary>
/// <returns></returns>
[HttpPost] //这里就不需要再标记特征了
public dynamic HYQYJS(TaskApiModels TaskApiModels)
{
//具体业务
return GenRet.Msg("success");
}
}