增加异常拦截处理
public static void Register(HttpConfiguration config)
{
// Web API 配置和服务
// Web API 路由 routeTemplate: "api/{controller}/{id}",
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{action}/{id}",
defaults: new { id = RouteParameter.Optional }
);
//自定义异常拦截器, 统一解析
config.Filters.Add(new CustomAttributes.CustomExceptionFilter());
//自定义错误消息处理委托类
config.MessageHandlers.Add(new CustomAttributes.CustomErrorMessageDelegatingHandler());
}
CustomExceptionFilter
/// <summary>
/// CustomExceptionFilter
/// </summary>
public class CustomExceptionFilter : ExceptionFilterAttribute
{
/// <summary>
/// OnException
/// </summary>
/// <param name="actionExecutedContext"></param>
public override void OnException(HttpActionExecutedContext actionExecutedContext)
{
ReturnT<int> robj = new ReturnT<int>();
HttpStatusCode status = HttpStatusCode.InternalServerError;
String message = String.Empty;
var exception = actionExecutedContext.Exception;
if (exception.GetType() == typeof(UnauthorizedAccessException))
{
message = "Access to the Web API is not authorized.";
status = HttpStatusCode.Unauthorized;
}
else if (exception.GetType() == typeof(DivideByZeroException))
{
message = "Internal Server Error.";
status = HttpStatusCode.InternalServerError;
}
else
{
message = exception.Message;
status = HttpStatusCode.InternalServerError;
}
robj.Result = (int)status;
robj.ErrorMessage = message;
robj.ExeResult = false;
actionExecutedContext.Response = new HttpResponseMessage()
{
Content = new StringContent(Newtonsoft.Json.JsonConvert.SerializeObject(robj), System.Text.Encoding.UTF8, "application/json"),
StatusCode = status
};
base.OnException(actionExecutedContext);
}
}
CustomErrorMessageDelegatingHandler
/// <summary>
/// API自定义错误消息处理委托类。用于处理访问不到对应API地址的情况,对错误进行自定义操作。
/// </summary>
public class CustomErrorMessageDelegatingHandler : DelegatingHandler
{
/// <summary>
///
/// </summary>
/// <param name="request"></param>
/// <param name="cancellationToken"></param>
/// <returns></returns>
protected override Task<HttpResponseMessage> SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)
{
return base.SendAsync(request, cancellationToken).ContinueWith<HttpResponseMessage>((responseToCompleteTask) => {
HttpResponseMessage response = responseToCompleteTask.Result;
HttpError error = null;
ReturnT<int> robj = new ReturnT<int>();
if (response.TryGetContentValue<HttpError>(out error))
{ //添加自定义错误处理 //error.Message = "Your Customized Error Message";
}
if (error != null)
{
robj.ExeResult = false;
robj.ErrorMessage = error.Message;
robj.Result = (int)response.StatusCode;
//获取抛出自定义异常,有拦截器统一解析
throw new HttpResponseException(new HttpResponseMessage(response.StatusCode)
{
Content = new StringContent(Newtonsoft.Json.JsonConvert.SerializeObject(robj), System.Text.Encoding.UTF8, "application/json"),
ReasonPhrase = "Exception"
});
}
else { return response; }
});
}
}