/// <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);
            }
        }
Beispiel #2
0
        /// <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");
            }
        }
Beispiel #3
0
        /// <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));
        }