• 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接口抛出一个异常就可以了。


     

  • 相关阅读:
    Pandas绘图不支持中文解决方案
    MVC模式
    解决import javafx.geometry.Point2D无法导入的问题
    初学linux时遇到的那些哭笑不得的问题
    啊啊我找不到web.xml怎么办呀~~
    解决JSP调用JavaBean出现乱码问题
    设置eclipse自动补全
    ubuntu下eclipse java ee首次打开提示找不到jdk的问题
    android webview 报 [ERROR:in_process_view_renderer.cc(189)] Failed to request GL process. Deadlock likely: 0 问题
    ubuntu创建文件夹桌面快捷方式
  • 原文地址:https://www.cnblogs.com/hanjun0612/p/9779898.html
Copyright © 2020-2023  润新知