前面讲了webapi的安适验证和参数安适,不清楚的伴侣,可以看看前面的文章,《Web API系列(二)接口安适和参数校验》,本文主要介绍Web API异常功效的措置惩罚惩罚。作为内部或者是对外供给的统一webapi 接口,统一的异常措置惩罚惩罚,把正确的信息返回给挪用者很重要。这样可以让接口开发人员,了解具体的原因地址,这样可以得到有效的错误措置惩罚惩罚。
需要注意的是,webapi异常的状态码,尽量不要和业务状态码混淆。可以分为两个差此外字段,或者是状态码的法则差别。相关返回数据的格局,可以参考,前面的文章。
1、通例措施异常措置惩罚惩罚通例的措施异常,指的是webapi 接口措施在执行的时候呈现的各类异常情况,可以使用异常筛选器捕获所有异常。
1. API自界说错误过滤器属性:ApiExceptionAttribute
/// <summary> /// API自界说错误过滤器属性 /// </summary> public class ApiExceptionHandlingAttribute : ExceptionFilterAttribute { /// <summary> /// 统一对挪用异常信息进行措置惩罚惩罚,返回自界说的异常信息 /// </summary> /// <param>HTTP上下文东西</param> public override void OnException(HttpActionExecutedContext context) { //自界说异常的措置惩罚惩罚 if (context.Exception is NotImplementedException) { throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.NotImplemented) { //封装措置惩罚惩罚异常信息,返回指定JSON东西 Content = new StringContent(JsonHelper.ToJson(new ErrorModel((int)HttpStatusCode.NotImplemented, 0, ex.Message)), Encoding.UTF8, "application/json"), ReasonPhrase = "NotImplementedException" }); } else if (context.Exception is TimeoutException) { throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.RequestTimeout) { //封装措置惩罚惩罚异常信息,返回指定JSON东西 Content = new StringContent(JsonHelper.ToJson(new ErrorModel((int)HttpStatusCode.RequestTimeout, 0, ex.Message)), Encoding.UTF8, "application/json"), ReasonPhrase = "TimeoutException" }); } //.....这里可以按照项目需要返回到客户端特定的状态码。如果找不到相应的异常,统一返回处事端错误500 else { throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.InternalServerError) { //封装措置惩罚惩罚异常信息,返回指定JSON东西 Content = new StringContent(JsonHelper.ToJson(new ErrorModel((int)HttpStatusCode.InternalServerError, 0, ex.Message)), Encoding.UTF8, "application/json"), ReasonPhrase = "InternalServerErrorException" }); } //base.OnException(context); //记录关键的异常信息 //Debug.WriteLine(context.Exception); } }
2. 界说好了错误过滤器,按照实际情况,在差别级别使用统一的异常措置惩罚惩罚机制。好比,接口action级别,控制器Controller级别或者是全局。
我们目前的使用的是全局进行异常过滤。在ApiBase 增加异常过滤。
[ApiAuth] [ApiExceptionHandling] public class ApiBase : ApiController
2、地点接口异常措置惩罚惩罚对付通例的异常,我们通过上面的措置惩罚惩罚方法,就可以很好进行拦截并措置惩罚惩罚了,如果接口异常是全局性的,如访谒地不正确,或者挪用的接口就不是有效的地点,,这样的话,返回的信息就不会被上面的拦截器进行措置惩罚惩罚了。
如我们给一个无效的API挪用路径,在浏览器中获得下面错误功效。
由于上面功效就无法被我们的通例异常拦截器所捕获,因此不会输出颠末封装好的异常信息。
所以如果需要拦截,我们需要增加本身的动静代办代理措置惩罚惩罚,用来捕获这些特殊的异常信息。
/// <summary> /// API自界说错误动静措置惩罚惩罚委托类。 /// 用于措置惩罚惩罚访谒不到对应API地点的情况,对错误进行自界说操纵。 /// </summary> public class CustomErrorMessageDelegatingHandler : DelegatingHandler { protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) { return base.SendAsync(request, cancellationToken).ContinueWith<HttpResponseMessage>((responseToCompleteTask) => { HttpResponseMessage response = responseToCompleteTask.Result; HttpError error = null; if (response.TryGetContentValue<HttpError>(out error)) { //添加自界说错误措置惩罚惩罚 //error.Message = "Your Customized Error Message"; } if (error != null) { //获取抛出自界说异常,有拦截器统一解析 throw new HttpResponseException(new HttpResponseMessage(HttpStatusCode.NotFound) { //封装措置惩罚惩罚异常信息,返回指定JSON东西 Content = new StringContent(JsonHelper.ToJson(new ErrorModel(404, 0, error.Message)), Encoding.UTF8, "application/json"), ReasonPhrase = "Exception" }); } else { return response; } }); } }
同时,在WebApiConfig中,注册上相关措置惩罚惩罚