167 lines
5.6 KiB
C#
167 lines
5.6 KiB
C#
using Furion.DataValidation;
|
|
using Furion.DependencyInjection;
|
|
using Furion.UnifyResult;
|
|
using Microsoft.AspNetCore.Http;
|
|
using Microsoft.AspNetCore.Mvc;
|
|
using Microsoft.AspNetCore.Mvc.Filters;
|
|
using Microsoft.AspNetCore.Mvc.ModelBinding;
|
|
using System;
|
|
using System.Collections.Generic;
|
|
using System.Threading.Tasks;
|
|
|
|
namespace Ewide.Core
|
|
{
|
|
/// <summary>
|
|
/// 规范化RESTful风格返回值
|
|
/// </summary>
|
|
[SkipScan, UnifyModel(typeof(XnRestfulResult<>))]
|
|
public class XnRestfulResultProvider : IUnifyResultProvider
|
|
{
|
|
/// <summary>
|
|
/// 异常返回值
|
|
/// </summary>
|
|
/// <param name="context"></param>
|
|
/// <returns></returns>
|
|
public IActionResult OnException(ExceptionContext context)
|
|
{
|
|
// 解析异常信息
|
|
var (StatusCode, ErrorCode, Errors) = UnifyContext.GetExceptionMetadata(context);
|
|
|
|
return new JsonResult(new XnRestfulResult<object>
|
|
{
|
|
Code = StatusCode,
|
|
Success = false,
|
|
Data = null,
|
|
Message = Errors,
|
|
Extras = UnifyContext.Take(),
|
|
Timestamp = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()
|
|
});
|
|
}
|
|
|
|
/// <summary>
|
|
/// 处理输出状态码
|
|
/// </summary>
|
|
/// <param name="context"></param>
|
|
/// <param name="statusCode"></param>
|
|
/// <returns></returns>
|
|
public async Task OnResponseStatusCodes(HttpContext context, int statusCode)
|
|
{
|
|
switch (statusCode)
|
|
{
|
|
// 处理 401 状态码
|
|
case StatusCodes.Status401Unauthorized:
|
|
await context.Response.WriteAsJsonAsync(new XnRestfulResult<object>
|
|
{
|
|
Code = StatusCodes.Status401Unauthorized,
|
|
Success = false,
|
|
Data = null,
|
|
Message = "401 未经授权",
|
|
Extras = UnifyContext.Take(),
|
|
Timestamp = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()
|
|
});
|
|
break;
|
|
// 处理 403 状态码
|
|
case StatusCodes.Status403Forbidden:
|
|
await context.Response.WriteAsJsonAsync(new XnRestfulResult<object>
|
|
{
|
|
Code = StatusCodes.Status403Forbidden,
|
|
Success = false,
|
|
Data = null,
|
|
Message = "403 禁止访问",
|
|
Extras = UnifyContext.Take(),
|
|
Timestamp = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()
|
|
});
|
|
break;
|
|
|
|
default:
|
|
break;
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// 成功返回值
|
|
/// </summary>
|
|
/// <param name="context"></param>
|
|
/// <returns></returns>
|
|
public IActionResult OnSucceeded(ActionExecutedContext context)
|
|
{
|
|
object data;
|
|
// 处理内容结果
|
|
if (context.Result is ContentResult contentResult) data = contentResult.Content;
|
|
// 处理对象结果
|
|
else if (context.Result is ObjectResult objectResult) data = objectResult.Value;
|
|
else if (context.Result is EmptyResult) data = null;
|
|
else return null;
|
|
|
|
return new JsonResult(new XnRestfulResult<object>
|
|
{
|
|
Code = context.Result is EmptyResult ? StatusCodes.Status204NoContent : StatusCodes.Status200OK, // 处理没有返回值情况 204
|
|
Success = true,
|
|
Data = data,
|
|
Message = "请求成功",
|
|
Extras = UnifyContext.Take(),
|
|
Timestamp = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()
|
|
});
|
|
}
|
|
|
|
/// <summary>
|
|
/// 验证失败返回值
|
|
/// </summary>
|
|
/// <param name="context"></param>
|
|
/// <param name="modelStates"></param>
|
|
/// <param name="validationResults"></param>
|
|
/// <param name="validateFailedMessage"></param>
|
|
/// <returns></returns>
|
|
public IActionResult OnValidateFailed(ActionExecutingContext context, ModelStateDictionary modelStates, IEnumerable<ValidateFailedModel> validationResults, string validateFailedMessage)
|
|
{
|
|
return new JsonResult(new XnRestfulResult<object>
|
|
{
|
|
Code = StatusCodes.Status400BadRequest,
|
|
Success = false,
|
|
Data = null,
|
|
Message = validationResults,
|
|
Extras = UnifyContext.Take(),
|
|
Timestamp = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()
|
|
});
|
|
}
|
|
}
|
|
|
|
/// <summary>
|
|
/// RESTful风格---XIAONUO返回格式
|
|
/// </summary>
|
|
/// <typeparam name="T"></typeparam>
|
|
[SkipScan]
|
|
public class XnRestfulResult<T>
|
|
{
|
|
/// <summary>
|
|
/// 执行成功
|
|
/// </summary>
|
|
public bool Success { get; set; }
|
|
|
|
/// <summary>
|
|
/// 状态码
|
|
/// </summary>
|
|
public int? Code { get; set; }
|
|
|
|
/// <summary>
|
|
/// 错误信息
|
|
/// </summary>
|
|
public object Message { get; set; }
|
|
|
|
/// <summary>
|
|
/// 数据
|
|
/// </summary>
|
|
public T Data { get; set; }
|
|
|
|
/// <summary>
|
|
/// 附加数据
|
|
/// </summary>
|
|
public object Extras { get; set; }
|
|
|
|
/// <summary>
|
|
/// 时间戳
|
|
/// </summary>
|
|
public long Timestamp { get; set; }
|
|
}
|
|
}
|