簡單實現接口返回統一格式:添加api接口執行時長
1.使用方式
// This method gets called by the runtime. Use this method to add services to the container. public void ConfigureServices(IServiceCollection services) { //注冊MemoryCache緩存中間件 services.AddMemoryCache(); services.AddSingleton<IHttpContextAccessor, HttpContextAccessor>(); //注冊Mvc services.AddControllers(options => { //注冊全局過濾器服務 options.Filters.Add(typeof(AppExceptionFilter)); //options.Filters.Add(typeof(AuthorizeFilter)); options.Filters.Add(typeof(AppResultFilter)); options.RespectBrowserAcceptHeader = true; }).AddControllersAsServices() //使用NewtonsoftJson序列化數據 .AddNewtonsoftJson(options => { //取消駱駝命名法 //options.SerializerSettings.ContractResolver = new DefaultContractResolver(); //設置返回datetime時間格式 options.SerializerSettings.DateFormatString = "yyyy'-'MM'-'dd' 'HH':'mm':'ss"; } ); }
[HttpGet] [ProducesResponseType(typeof(ApiResult<List<WeatherForecast>>), 200)] public IEnumerable<WeatherForecast> Get() { var a = dishesCategoryRepository.CountAll(); var rng = new Random(); return Enumerable.Range(1, 5).Select(index => new WeatherForecast { Date = DateTime.Now.AddDays(index), TemperatureC = rng.Next(-20, 55), Summary = Summaries[rng.Next(Summaries.Length)] }) .ToArray(); }
/// 返回數據格式
{
"httpStatus" :200,
"data" :{},
"message" :"執行成功",
"timeOut":2021
}
2.具體實現
/// <summary> /// 返回結果過濾器,統一返回數據格式 /// </summary> public class AppResultFilter : Attribute, IActionFilter { /// <summary> /// 請求時長計時開始 /// </summary> private readonly Stopwatch watch = new Stopwatch(); /// <summary> /// 返回結果執行之前 /// </summary> /// <param name="context"></param> public void OnActionExecuting(ActionExecutingContext context) { watch.Start();//開始 } /// <summary> /// 返回結果執行之后 /// </summary> /// <param name="context"></param> public void OnActionExecuted(ActionExecutedContext context) { watch.Stop(); //根據實際需求進行具體實現 if (context.Result is ObjectResult) { var objectResult = context.Result as ObjectResult; if (objectResult.Value == null) { context.Result = new ObjectResult(new ApiResult { HttpStatus = HttpStatusCode.NotFound, Message = "未找到資源", TimeOut = watch.ElapsedMilliseconds }); } else { if (objectResult.Value is ApiResult) { var result = (ApiResult)objectResult.Value; result.TimeOut = watch.ElapsedMilliseconds; context.Result = new ObjectResult(result); return; } context.Result = new ObjectResult(new ApiResult { HttpStatus = HttpStatusCode.OK, Message = "請求成功", Data = objectResult.Value, TimeOut = watch.ElapsedMilliseconds }); //判讀是否返回的是元組 //返回數據並且返回總行數 public async Task<(List<object>,int)> Paging(PagingBaseRequest parameter) { retuen ( new List<object>{ },1000) } if (objectResult.DeclaredType != null && objectResult.DeclaredType.Name == "ValueTuple`2") { dynamic value = objectResult.Value; if (value.Item1 != null) { if (value.Item1 is int) { //返回元組格式(int,List<object>) context.Result = new ObjectResult(new ApiResult { HttpStatus = HttpStatusCode.OK, Message = "請求成功", TimeOut = watch.ElapsedMilliseconds, Data = new { Count = value.Item1, Data = value.Item2 } }); } else //返回元組格式(List<object>,int) context.Result = new ObjectResult(new ApiResult { HttpStatus = HttpStatusCode.OK, Message = "請求成功", TimeOut = watch.ElapsedMilliseconds, Data = new { Count = value.Item2, Data = value.Item1 } }); } } } } else if (context.Result is EmptyResult) { context.Result = new ObjectResult(new ApiResult { HttpStatus = HttpStatusCode.OK, Message = "請求成功" }); } else if (context.Result is ContentResult) { context.Result = new ObjectResult(new ApiResult { HttpStatus = HttpStatusCode.OK, Message = "", TimeOut = watch.ElapsedMilliseconds, Data = (context.Result as ContentResult).Content }); } else if (context.Result is StatusCodeResult) { context.Result = new ObjectResult(new { HttpStatus = (context.Result as StatusCodeResult).StatusCode, TimeOut = watch.ElapsedMilliseconds, Message = "" }); } else if (context.Result is Exception) { var result = context.Result as Exception; context.Result = new ObjectResult(new { HttpStatus = HttpStatusCode.BadRequest, TimeOut = watch.ElapsedMilliseconds, Message = result.Message }); } } }
/// <summary> /// 數據返回模型基類 /// </summary> public class ApiResult { /// <summary> /// 返回狀態碼 /// </summary> public virtual HttpStatusCode HttpStatus { get; set; } = HttpStatusCode.OK; /// <summary> /// 返回數據 /// </summary> public virtual object Data { get; set; } /// <summary> /// 獲取 消息內容 /// </summary> public virtual string Message { get; set; } /// <summary> /// 執行時長 /// </summary> public virtual long TimeOut { get; set; }