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

 

 

 


 

posted @ 2016-03-17 14:33  正怒月神  阅读(124)  评论(0编辑  收藏  举报