/// <summary> /// 设置Response的head /// </summary> /// <param name="content"> /// Responset的上下文. /// </param> /// <param name="header"> /// head的实体 /// </param> public static void SetResponseHeadInfo(this HttpResponseMessage content, HeaderResponsetInfo header) { var dict = Convert.ConvertUtility.EntityToDictionary(header); foreach (var li in dict.Where(x => x.Key != null && x.Value != null)) { content.Headers.Add(li.Key, li.Value); } }
/// <summary> /// Action执行完成的过滤器 /// </summary> /// <param name="actionExecutedContext">操作执行的上下文</param> public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext) { base.OnActionExecuted(actionExecutedContext); // 不处理异常事件,异常由ExceptionFilter进行处理 if (actionExecutedContext.Exception != null) { return; } // 不处理http状态码为200的action,例如路由不匹配action等则无须处理 if (actionExecutedContext.Response.StatusCode != HttpStatusCode.OK && actionExecutedContext.Response.StatusCode != HttpStatusCode.NoContent) { return; } // 特殊处理,当HttpStatusCode.NoContent时也当作HttpStatusCode.OK处理,因为客户端就只验证状态码为200,对于204状态码会当作异常处理 if (actionExecutedContext.Response.StatusCode == HttpStatusCode.NoContent) { actionExecutedContext.Response.StatusCode = HttpStatusCode.OK; } // 写入head var head = new HeaderResponsetInfo { ApiCode = ((int)actionExecutedContext.Response.StatusCode).ToString(CultureInfo.InvariantCulture), ApiMessage = "OK", ApiVersion = "v2.0.0" }; try { actionExecutedContext.Response.SetResponseHeadInfo(head); } catch (Exception ex) { throw new ErrorCodeException("500", "设置http head 出现失败,原因:" + ex.Message, "SystemError"); } }
/// <summary> /// 异常筛选器 /// </summary> /// <param name="actionExecutedContext">异常类型</param> /// <param name="cancellationToken">取消标记</param> /// <returns>异步异常筛选器</returns> public Task ExecuteExceptionFilterAsync(HttpActionExecutedContext actionExecutedContext, CancellationToken cancellationToken) { return(Task.Factory.StartNew( () => { // 路由相关的信息 (收集信息,暂时不需要记录所以注释该段代码) ////var route = actionExecutedContext.Request.GetRouteData().Route.RouteTemplate; ////var method = actionExecutedContext.Request.Method.Method; ////var url = actionExecutedContext.Request.RequestUri.AbsoluteUri; //var controllerName = // actionExecutedContext.ActionContext.ActionDescriptor.ControllerDescriptor.ControllerName; //var actionName = actionExecutedContext.ActionContext.ActionDescriptor.ActionName; // 业务模块抛出的异常信息 var exception = actionExecutedContext.Exception as ErrorCodeException; if (exception == null) { // 系统系统时 /*exception = new ErrorCodeException("500", actionExecutedContext.Exception.Message, * "SystemError!");*/ exception = new ErrorCodeException("500", actionExecutedContext.Exception.Message, actionExecutedContext.Exception) { DisplayMessage = actionExecutedContext.Exception.Message }; } ILog log = LogManager.GetLogger(this.GetType().Name); // 写入head var head = new HeaderResponsetInfo { ApiCode = exception.ErrorCode, ApiMessage = exception.DisplayMessage, ApiVersion = "v2.0.0" }; try { actionExecutedContext.Response.SetResponseHeadInfo(head); ; } catch (Exception ex) { var msg = BuildMesageStack(ex); log.Error("拦截异常HttpHead信息:" + Json.Encode(head)); log.Error("拦截异常发生错误,原因:" + msg); } // 异常时直接抛出500错误 # 20151215 kk186 修改:异常拦截时统一向外返回200状态码 actionExecutedContext.Response = actionExecutedContext.Request.CreateResponse(HttpStatusCode.OK); actionExecutedContext.Response = actionExecutedContext.Request .CreateResponse(HttpStatusCode.OK, new { code = head.ApiCode, msg = head.ApiMessage }, new JsonMediaTypeFormatter()); // 使用log4net写入 /*var excptionMsg = exception.Message + (exception.InnerException != null ? ".InnerException:" + exception.InnerException.Message : string.Empty);*/ var excptionMsg = BuildMesageStack(exception); excptionMsg.AppendLine("ErrorCode:" + exception.ErrorCode); excptionMsg.AppendLine("DisplayMessage:" + exception.DisplayMessage); log.Error(excptionMsg.ToString()); // 使用ETM公用的日志写入 Logger.Write(Log.Log_Type.Error, "WebApi_Exception_Filter:" + excptionMsg.ToString()); }, cancellationToken)); }