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

 

 

 


 

转载于:https://www.cnblogs.com/hanjun0612/p/9779898.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值