使用一个枚举类封装一下常用的业务代码
public enum ResultCode
{
[Description("操作失败!")]
Fail = 10000,
[Description("请求成功!")]
Success = 20000
}
我又想要能够在返回状态码的时候能够附带着返回一下对应的Descrioption,所以定义一个静态类,用于获取enum类上的Description特性
public static class EnumHelper
{
// 获取枚举类型的所有值和它们的描述
public static Dictionary<T, string> GetDescriptions<T>() where T : Enum
{
var descriptions = new Dictionary<T, string>();
foreach (var value in Enum.GetValues(typeof(T)).Cast<T>())
{
var fieldInfo = typeof(T).GetField(value.ToString());
var attributes = (DescriptionAttribute[])fieldInfo.GetCustomAttributes(
typeof(DescriptionAttribute), false);
descriptions[value] = attributes.Length > 0 ? attributes[0].Description : value.ToString();
}
return descriptions;
}
}
现在来定义要返回的JsonResult类
public class JsonResult
{
public bool Success { get; set; }
public int Code { get; set; }
public string? Msg { get; set; }
public Object? Data { get; set; }
public JsonResult(){}
public JsonResult(bool success)
{
Success = success;
Code = success ? (int)ResultCode.Success : (int)ResultCode.Fail;
Msg = ResultTool.DescriptionsDictionary[(ResultCode)Code];
}
public JsonResult(bool success, string msg)
{
Success = success;
Code = success ? (int)ResultCode.Success : (int)ResultCode.Fail;
Msg = msg;
}
public JsonResult(bool success, ResultCode resultEnum)
{
Success = success;
Code = success ? (int)ResultCode.Success : (int)resultEnum;
Msg = ResultTool.DescriptionsDictionary[(ResultCode)Code];
}
public JsonResult(bool success, Object data)
{
Success = success;
Code = success ? (int)ResultCode.Success : (int)ResultCode.Fail;
Msg = ResultTool.DescriptionsDictionary[(ResultCode)Code];
Data = data;
}
public JsonResult(bool success, ResultCode resultEnum, Object data)
{
Success = success;
Code = success ? (int)ResultCode.Success : (int)resultEnum;
Msg = ResultTool.DescriptionsDictionary[(ResultCode)Code];
Data = data;
}
public JsonResult(bool success, ResultCode resultEnum, string msg)
{
Success = success;
Code = success ? (int)ResultCode.Success : (int)resultEnum;
this.Msg = msg;
}
}
使用ResultTool快速构建一个JsonResult类
public static class ResultTool
{
public static Dictionary<ResultCode, string> DescriptionsDictionary = EnumHelper.GetDescriptions<ResultCode>();
public static JsonResult Success()
{
return new JsonResult(true);
}
public static JsonResult Success(Object data)
{
return new JsonResult(true, data);
}
public static JsonResult Fail()
{
return new JsonResult(false);
}
public static JsonResult Fail(ResultCode resultCode)
{
return new JsonResult(false, resultCode);
}
public static JsonResult Fail(ResultCode resultCode, string msg)
{
return new JsonResult(false, resultCode, msg);
}
public static JsonResult Fail(string msg)
{
return new JsonResult(false, msg);
}
public static JsonResult Fail(bool b, ResultCode resultCode, string message)
{
return new JsonResult(false, resultCode, message);
}
}
现在去Controlle中尝试下
[ApiController]
[Route("[controller]")]
public class WeatherForecastController : ControllerBase
{
private static readonly string[] Summaries = new[]
{
"Freezing", "Bracing", "Chilly", "Cool", "Mild", "Warm", "Balmy", "Hot", "Sweltering", "Scorching"
};
private readonly ILogger<WeatherForecastController> _logger;
public WeatherForecastController(ILogger<WeatherForecastController> logger)
{
_logger = logger;
}
[HttpGet(Name = "GetWeatherForecast")]
public JsonResult Get()
{
var MyList = Enumerable.Range(1, 2).Select(index => new WeatherForecast
{
Date = DateTime.Now.AddDays(index),
TemperatureC = Random.Shared.Next(-20, 55),
Summary = Summaries[Random.Shared.Next(Summaries.Length)]
})
.ToArray();
return ResultTool.Success(MyList);
}
}
现在能够正确的返回我想要的格式。有很多大佬使用了中间件或者过滤器来实现统一封装返回结果,我个人感觉我这种方式比较简单,也比较便于理解。
程序运行时难免出现异常情况,有时候是我们手动抛出业务异常返回给前端,比如删除的字段前端没有传给我们导致的异常。我们手动抛出一个异常试一下。
尝试对异常进行处理,也能够返回对应的JsonResult。首先定义一个BusinessException继承Exception。
public class BusinessException : Exception
{
public ResultCode ErrorCode { get; set; }
public BusinessException(string message) : base(message)
{
ErrorCode = ResultCode.Fail;
}
public BusinessException(ResultCode errorCode, string message) : base(message)
{
this.ErrorCode = errorCode;
}
}
然后定义一个中间件,以便捕获程序运行中的异常。
public class ExceptionHandlerMiddleware
{
private readonly RequestDelegate _next;
public ExceptionHandlerMiddleware(RequestDelegate next)
{
_next = next;
}
public async Task Invoke(HttpContext context)
{
try
{
await _next(context);
}
catch (Exception ex)
{
await HandleExceptionAsync(context, ex);
}
}
private static Task HandleExceptionAsync(HttpContext context, Exception exception)
{
context.Response.ContentType = "application/json";
context.Response.StatusCode = (int)HttpStatusCode.OK;
JsonResult result;
if (exception is BusinessException businessException)
{
// BusinessException处理
result = ResultTool.Fail(businessException.ErrorCode, businessException.Message);
}
else
{
// 其他未处理异常处理
// result = ResultTool.Fail(ResultCode.Fail, exception.Message);
result = ResultTool.Fail(ResultCode.Fail, "系统异常!");
}
return context.Response.WriteAsJsonAsync(result);
}
}
然后在Program.cs中添加这个中间件,全局异常中间件处理应该尽可能的靠前,这样才能够捕获尽可能多的异常。
app.UseMiddleware<ExceptionHandlerMiddleware>();
手动抛一个异常试试