博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Web API 下的 ActionFilter 与 ExceptionFilter
阅读量:6599 次
发布时间:2019-06-24

本文共 3954 字,大约阅读时间需要 13 分钟。

本文重点会标红。
背景需求,在进入action之前做sign验证,以及反正错误时,记录log,返回错误的json形式信息。
#region  普通 ActionFilter add by caoheyang 20150319    ///     /// sign 以及参数合法性验证过滤器 add by caoheyang 20150318    ///     public class SignOpenApiAttribute : System.Web.Http.Filters.ActionFilterAttribute    {        ///         /// 重写OnActionExecuting方法   在进入控制器之前验证 sign以及 参数合法性信息 add by caoheyang 20150318        ///         ///         public override void OnActionExecuting(System.Web.Http.Controllers.HttpActionContext actionContext)        {            lock (actionContext)            {                dynamic paramodel = actionContext.ActionArguments["paramodel"]; //当前请求的参数对象                 if (actionContext.ModelState.Count > 0 || paramodel == null) //参数错误,请求中止                    actionContext.Response = actionContext.ActionDescriptor.ResultConverter.Convert                            (actionContext.ControllerContext, ResultModel.Conclude(OrderApiStatusType.ParaError));                IGroupProvider groupProvider = new GroupProvider();                GroupApiConfigModel groupCofigInfo = groupProvider.GetGroupApiConfigByAppKey(paramodel.app_key, paramodel.v).Data;                if (groupCofigInfo != null && groupCofigInfo.IsValid == 1)//集团可用,且有appkey信息                {                    string signStr = groupCofigInfo.AppSecret + "app_key=" + paramodel.app_key + "timestamp" + paramodel.timestamp + "v=" + paramodel.v + groupCofigInfo.AppSecret;                    string sign = MD5.Encrypt(signStr);                    paramodel.group = ParseHelper.ToInt(groupCofigInfo.GroupId, 0);                    actionContext.ActionArguments["paramodel"] = paramodel; ;                    if (sign != paramodel.sign)   //sign错误,请求中止                        actionContext.Response = actionContext.ActionDescriptor.ResultConverter.Convert                            (actionContext.ControllerContext, ResultModel.Conclude(OrderApiStatusType.SignError)); //此处标红需要与 apicontroller里应用fillter的action返回值一直。                }                else                    actionContext.Response = actionContext.ActionDescriptor.ResultConverter.Convert                           (actionContext.ControllerContext, ResultModel.Conclude(OrderApiStatusType.SignError));  //sign错误,请求中止            }        }    }    #endregion    #region  ExceptionFilter add by caoheyang 20150319    ///     /// 自定义全局异常处理类  add by caoheyang 20150319   全局过滤器,记录log    ///     public class OpenApiHandleErrorAttribute : ExceptionFilterAttribute    {        ///         /// 重写异常处理方法 add by caoheyang 20150205  其次执行        ///         /// 上下文对象  该类继承于ControllerContext        public override void OnException(HttpActionExecutedContext filterContext)        {            LogHelper.LogWriterFromFilter(filterContext.Exception);        }    }    ///   action过滤器,当内部代码发生异常时,改变当前的请求服务器端返回信息    /// 自定义action异常处理类,捕获异常,返回系统错误提示信息  add by caoheyang 20150319    ///     public class OpenApiActionErrorAttribute : ExceptionFilterAttribute    {        ///         /// 重写异常处理方法 add by caoheyang 20150205    首先执行          ///         /// 上下文对象  该类继承于ControllerContext        public override void OnException(HttpActionExecutedContext filterContext)        {            filterContext.Response = filterContext.ActionContext.ActionDescriptor.ResultConverter.              Convert(filterContext.ActionContext.ControllerContext, ResultModel.Conclude(OrderApiStatusType.SystemError));
//此处标红需要与 apicontroller里应用fillter的action返回值一直。
} } #endregion

ApiController eg。

// POSR: Order GetStatus    paramodel 固定 必须是 paramodel        ///         /// 订单状态查询功能  add by caoheyang 20150316        ///         /// 
[HttpPost] [SignOpenApi] //sign验证过滤器 设计参数验证,sign验证 add by caoheyang 201503167 [OpenApiActionError] //异常过滤器 add by caoheyang 一旦发生异常,客户端返回系统内部错误提示 public ResultModel GetStatus(ParaModel
paramodel) { }

 

 

转载于:https://www.cnblogs.com/caoheyang911016/p/4351092.html

你可能感兴趣的文章
svs 在创建的时候 上传文件夹 bin obj 这些不要提交
查看>>
深度优先搜索-----部分和问题
查看>>
javascript 数组方法总结
查看>>
document.location.search 的作用
查看>>
mysql-用命令导出、导入表结构或数据
查看>>
不要从栈上返回一个局部变量的引用
查看>>
input点击链接另一个页面,各种操作
查看>>
TreeView
查看>>
Tinkphp
查看>>
向网页中嵌入百度地图
查看>>
EntityFrameworkCore 一对一 && 一对多 && 多对多配置
查看>>
How to temporally disable IDE tools (load manually)
查看>>
JS-复习整理
查看>>
Vue.js学习 Item4 -- 数据双向绑定
查看>>
几种排序方式的java实现(01:插入排序,冒泡排序,选择排序,快速排序)
查看>>
如何书写高质量的jQuery代码
查看>>
host-only
查看>>
linux命令行音量控制
查看>>
【转】【涨姿势】支付宝怎么做风险控制?
查看>>
Linux服务器重启后MySQL启动失败
查看>>