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