zoukankan      html  css  js  c++  java
  • web api 异常处理

    参考了:http://blog.csdn.net/for12/article/details/49685567

    首先,创建一个类:

    public class APIResult<T> 
        {
            public APIResult(){}
    
            public bool ResponseResult = false;
            public string ResponseMsg = "failed";
            public HttpStatusCode ResponseCode = HttpStatusCode.Unauthorized;
    
            public T Data;
        }

    然后我们创建继承自 ActionFilterAttribute的类,

    用来处理自定义异常
    (你也可以跳过这一段)

    [AttributeUsage(AttributeTargets.Method | AttributeTargets.Class, Inherited = true, AllowMultiple = true)]
        public class APISignAttribute : ActionFilterAttribute
        {
            public static readonly string APISign = WebConfigurationManager.AppSettings["APISign"];
    
            public override void OnActionExecuting(HttpActionContext actionContext)
            {
    
                if (IsVaild(actionContext))
                {
                    base.OnActionExecuting(actionContext);
                }
                else
                {
                    throw new InvalidTokenException("Invalid Token");
                }
    
            }
    
    //token是否有效
            public bool IsVaild(HttpActionContext actionContext)
            {
                string token = HttpContext.Current.Request.QueryString["token"].ToString();
                RedisBLL<apiToken> rds = new RedisBLL<apiToken>();
                if (token != null && token.Length > 0 && rds.HasToken(token))
                {
                    return true;
                }
    
                return false;
            }
    
            public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)
            {
                // 若发生例外则不在这边处理
                if (actionExecutedContext.Exception != null)
                    return;
    
                base.OnActionExecuted(actionExecutedContext);
            }
        }

    重点:创建异常处理类:

    using System.Net.Http;
    
    public class ApiErrorHandleAttribute : System.Web.Http.Filters.ExceptionFilterAttribute
    {
           public override void OnException(HttpActionExecutedContext actionExecutedContext)
            {
                base.OnException(actionExecutedContext);
    
                var result = new apiResult<object>()
                {
                    code = HttpStatusCode.BadRequest,
                    msg = actionExecutedContext.Exception.Message
                };
    //判断异常类型,返回不同的状态码
                      if (actionExecutedContext.Exception is InvalidTokenException)
                {
                    result.code = HttpStatusCode.Unauthorized;
                }
                // 重新打包回传的讯息
                actionExecutedContext.Response = actionExecutedContext.Request.CreateResponse(result.code, result);
                
            }
    
    }

    InvalidTokenException:

    public class InvalidTokenException:ApplicationException
        {
            public InvalidTokenException() { }
            public InvalidTokenException(string message) : base(message) { }
            public override string Message
            {
                get
                {
                    return base.Message;
                }
            }
        }

    最后注册一下:WebApiConfig

    config.Filters.Add(new APISignAttribute());
    config.Filters.Add(new ApiErrorHandleAttribute());

    controller代码就是api接口抛出一个异常就可以了。


     

  • 相关阅读:
    算法,折半查找--javascript版
    选择排序---堆排序算法(Javascript版) 降序排列
    常用的js正则总结
    前端工作流,集成解决方案,国内值得研究的
    gulp构建项目踩坑实战
    svg图片自适应div容器大小
    coffeeScript学习小结
    javascript正则匹配中文
    android开发中R文件丢失
    MySql 5.7密码查看或修改
  • 原文地址:https://www.cnblogs.com/hanjun0612/p/9779898.html
Copyright © 2011-2022 走看看