对于ABP的文档中的说明,那个httpcode是不一定的,如果你用Volo.Abp.UserFriendlyException他返回的错误也有可能是401 403 500等,这对于前端来说就是个不确定值啊,所以我们给他修改下。
如果不采用AbpAuthorizationException则我们抛弃他,全部使用UserFriendlyException,因为他可以带上Code
定义一个全局错误过滤器,如下:
public class ABCExceptionFilterAttribute : ExceptionFilterAttribute {
private readonly ILogger<ABCExceptionFilterAttribute> _logger;
public ABCExceptionFilterAttribute(ILogger<ABCExceptionFilterAttribute> logger) {
_logger = logger;
}
public override void OnException(ExceptionContext context)
{
// 如果异常没有被处理则进行处理
if (context.ExceptionHandled == false)
{
var userExpect = context.Exception as UserFriendlyException;
var info = new ExceptionModel();
info.error = new CustomBackModel();
info.error.code = "500";
info.error.success = false;
info.error.message = "服务器遇到一个错误,无法继续为您服务!";
if (userExpect != null)
{
if (!String.IsNullOrEmpty(userExpect.Code))
{
info.error.code = userExpect.Code;
}
else
{
info.error.code = "502";
}
info.error.message = context.Exception.Message;
}
else {
var volexception = context.Exception as Volo.Abp.Validation.AbpValidationException;
if (volexception != null) {
info.error.code = "400";
info.error.message = volexception.Message;
}
}
//写入日志
_logger.LogError(context.Exception, context.HttpContext.Request.Path,null);
context.Result = new ContentResult
{
// 返回状态码设置为200,表示成功
StatusCode = int.Parse(info.error.code),
// 设置返回格式
ContentType = "application/json;charset=utf-8",
Content = Newtonsoft.Json.JsonConvert.SerializeObject(info)
};
}
// 设置为true,表示异常已经被处理了
context.ExceptionHandled = true;
}
public override Task OnExceptionAsync(ExceptionContext context)
{
return base.OnExceptionAsync(context);
}
}
然后到入口处注册一下:
context.Services.AddControllers(options => { options.Filters.Add(typeof(ABCExceptionFilterAttribute)); });
然后你就可以愉快的去其他地方throw new UserFriendlyExpection("错误信息","错误代码int类型")了,你也可以修改下,比如非httpcode,则写在返回内容中的error.code中。