|
本文重點(diǎn)會標(biāo)紅。
背景需求,在進(jìn)入action之前做sign驗(yàn)證,以及反正錯誤時(shí),記錄log,返回錯誤的json形式信息。
#region 普通 ActionFilter add by caoheyang 20150319 /// <summary> /// sign 以及參數(shù)合法性驗(yàn)證過濾器 add by caoheyang 20150318 /// </summary> public class SignOpenApiAttribute : System.Web.Http.Filters.ActionFilterAttribute { /// <summary> /// 重寫OnActionExecuting方法 在進(jìn)入控制器之前驗(yàn)證 sign以及 參數(shù)合法性信息 add by caoheyang 20150318 /// </summary> /// <param name="actionContext"></param> public override void OnActionExecuting(System.Web.Http.Controllers.HttpActionContext actionContext) { lock (actionContext) { dynamic paramodel = actionContext.ActionArguments["paramodel"]; //當(dāng)前請求的參數(shù)對象 if (actionContext.ModelState.Count > 0 || paramodel == null) //參數(shù)錯誤,請求中止 actionContext.Response = actionContext.ActionDescriptor.ResultConverter.Convert (actionContext.ControllerContext, ResultModel<object>.Conclude(OrderApiStatusType.ParaError)); IGroupProvider groupProvider = new GroupProvider(); GroupApiConfigModel groupCofigInfo = groupProvider.GetGroupApiConfigByAppKey(paramodel.app_key, paramodel.v).Data; if (groupCofigInfo != null && groupCofigInfo.IsValid == 1)//集團(tuán)可用,且有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<object>.Conclude(OrderApiStatusType.SignError)); //此處標(biāo)紅需要與 apicontroller里應(yīng)用fillter的action返回值一直。 } else actionContext.Response = actionContext.ActionDescriptor.ResultConverter.Convert (actionContext.ControllerContext, ResultModel<object>.Conclude(OrderApiStatusType.SignError)); //sign錯誤,請求中止 } } } #endregion #region ExceptionFilter add by caoheyang 20150319 /// <summary> /// 自定義全局異常處理類 add by caoheyang 20150319 全局過濾器,記錄log /// </summary> public class OpenApiHandleErrorAttribute : ExceptionFilterAttribute { /// <summary> /// 重寫異常處理方法 add by caoheyang 20150205 其次執(zhí)行 /// </summary> /// <param name="filterContext">上下文對象 該類繼承于ControllerContext</param> public override void OnException(HttpActionExecutedContext filterContext) { LogHelper.LogWriterFromFilter(filterContext.Exception); } } /// <summary> action過濾器,當(dāng)內(nèi)部代碼發(fā)生異常時(shí),改變當(dāng)前的請求服務(wù)器端返回信息 /// 自定義action異常處理類,捕獲異常,返回系統(tǒng)錯誤提示信息 add by caoheyang 20150319 /// </summary> public class OpenApiActionErrorAttribute : ExceptionFilterAttribute { /// <summary> /// 重寫異常處理方法 add by caoheyang 20150205 首先執(zhí)行 /// </summary> /// <param name="filterContext">上下文對象 該類繼承于ControllerContext</param> public override void OnException(HttpActionExecutedContext filterContext) { filterContext.Response = filterContext.ActionContext.ActionDescriptor.ResultConverter. Convert(filterContext.ActionContext.ControllerContext, ResultModel<object>.Conclude(OrderApiStatusType.SystemError)); //此處標(biāo)紅需要與 apicontroller里應(yīng)用fillter的action返回值一直。} } #endregion ApiController eg。 // POSR: Order GetStatus paramodel 固定 必須是 paramodel /// <summary> /// 訂單狀態(tài)查詢功能 add by caoheyang 20150316 /// </summary> /// <returns></returns> [HttpPost] [SignOpenApi] //sign驗(yàn)證過濾器 設(shè)計(jì)參數(shù)驗(yàn)證,sign驗(yàn)證 add by caoheyang 201503167 [OpenApiActionError] //異常過濾器 add by caoheyang 一旦發(fā)生異常,客戶端返回系統(tǒng)內(nèi)部錯誤提示 public ResultModel<object> GetStatus(ParaModel<GetStatusPM_OpenApi> paramodel) { } |
|
|