Asp.net webApi统一封装返回结果+全局异常处理

1.定义统一的返回类

/// <summary>
    /// 返回类型
    /// </summary>
    public class ApiResultModel
    {
        private HttpStatusCode statusCode;
        private object data;
        private string errorMessage;
        private bool isSuccess;

        /// <summary>
        /// 状态代码
        /// </summary>
        public HttpStatusCode StatusCode
        {
            get { return statusCode; }
            set { statusCode = value; }
        }

        /// <summary>
        /// 返回的数据
        /// </summary>
        public object Data
        {
            get { return data; }
            set { data = value; }
        }

        /// <summary>
        /// 错误消息
        /// </summary>
        public string ErrorMessage
        {
            get { return errorMessage; }
            set { errorMessage = value; }
        }

        /// <summary>
        /// 是否成功
        /// </summary>
        public bool IsSuccess
        {
            get { return isSuccess; }
            set { isSuccess = value; }
        }
    }

2.定义不需要被封装的特性

public class NoPackageResult : Attribute
{
     
}

3.定义Json结果处理类

public class JsonHelper
    {

        public static HttpResponseMessage toJson(Object obj)
        {
            String str;
            if (obj is String || obj is Char)//如果是字符串或字符直接返回
            {
                str = obj.ToString();
            }
            else//否则序列为json字串
            {
                JavaScriptSerializer serializer = new JavaScriptSerializer();
                str = serializer.Serialize(obj);
            }
            HttpResponseMessage result = new HttpResponseMessage { Content = new StringContent(str, Encoding.GetEncoding("UTF-8"), "application/json") };
            return result;
        }
    }

4.定义统一格式过滤器

public class ApiResultAttribute : System.Web.Http.Filters.ActionFilterAttribute
    {
        public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
        {
            // 不包裹返回值
            var noPackage = actionExecutedContext.ActionContext.ActionDescriptor.GetCustomAttributes<NoPackageResult>();
            if (!noPackage.Any())
            {
                ApiResultModel result = new ApiResultModel();
                //先捕获API内部的异常,无论代码能否完整执行,客户端都能得到正确的响应格式
                if (actionExecutedContext.Exception != null)
                {
                    throw actionExecutedContext.Exception;
                    //result.StatusCode = System.Net.HttpStatusCode.InternalServerError;
                    //result.IsSuccess = false;
                    //result.ErrorMessage = actionExecutedContext.Exception.Message;
                }
                else
                {
                    // 取得由 API 返回的状态代码
                    result.StatusCode = actionExecutedContext.ActionContext.Response.StatusCode;
                    var a = actionExecutedContext.ActionContext.Response.Content.ReadAsAsync<object>();
                    if (!a.IsFaulted)
                    {
                        // 取得由 API 返回的资料
                        result.Data = actionExecutedContext.ActionContext.Response.Content.ReadAsAsync<object>().Result;
                    }
                    //请求是否成功
                    result.IsSuccess = actionExecutedContext.ActionContext.Response.IsSuccessStatusCode;
                }
                //结果转为自定义消息格式
                HttpResponseMessage httpResponseMessage = JsonHelper.toJson(result);

                // 重新封装回传格式 
                actionExecutedContext.Response = httpResponseMessage;
            }
        }
    }

5.在WebApiConfig下注册的结果过滤器

config.Filters.Add(new ApiResultAttribute());//重新包装结果

6.封装全局异常处理

/// <summary>
    /// 全局异常过滤器 
    /// </summary>
    /// <!-- 2019-8-22 16:18:10   添加 -->
    public class ExceptionFilter : System.Web.Http.Filters.IExceptionFilter
    {
        public bool AllowMultiple => true;

        public Task ExecuteExceptionFilterAsync(HttpActionExecutedContext actionExecutedContext, CancellationToken cancellationToken)
        {
            var ex = actionExecutedContext.Exception.InnerException ?? actionExecutedContext.Exception;
            return Task.Run(() =>
            {
                //异常记录日志到本地 2019-8-28 13:55:45 添加
                //Common.LogHelpter.AddLog(ex.ToString());

                string msg = ex.Message;
                ApiResultModel result = new ApiResultModel();
                result.IsSuccess = false;
                result.StatusCode = System.Net.HttpStatusCode.OK;
                result.ErrorMessage = msg;
                //结果转为自定义消息格式
                HttpResponseMessage httpResponseMessage = JsonHelper.toJson(result);

                // 重新封装回传格式 
                actionExecutedContext.Response = httpResponseMessage;
            });
        }

    }

7.在WebApiConfig下注册的全局异常过滤器

config.Filters.Add(new ExceptionFilter());//重新包装异常处理过滤器
  • 7
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值