You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
BookingHeChuan/Myshipping.Core/Extension/RestfulResultProvider.cs

158 lines
4.7 KiB
C#

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

using Furion.DataValidation;
using Furion.DependencyInjection;
using Furion.FriendlyException;
using Furion.UnifyResult;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.Filters;
using Myshipping.Core.Attributes;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Reflection;
using System.Reflection.Metadata;
using System.Threading.Tasks;
namespace Myshipping.Core;
/// <summary>
/// 规范化RESTful风格返回值
/// </summary>
[SuppressSniffer, UnifyModel(typeof(XnRestfulResult<>))]
public class RestfulResultProvider : IUnifyResultProvider
{
public IActionResult OnException(ExceptionContext context, ExceptionMetadata metadata)
{
// 解析异常信息
var exceptionMetadata = UnifyContext.GetExceptionMetadata(context);
return new JsonResult(new XnRestfulResult<object>
{
Code = exceptionMetadata.StatusCode,
Success = false,
Data = null,
Message = exceptionMetadata.Errors,
Extras = UnifyContext.Take(),
Timestamp = DateTime.Now.Millisecond
});
}
public IActionResult OnSucceeded(ActionExecutedContext context, object data)
{
switch (context.Result)
{
// 处理内容结果
case ContentResult contentResult:
data = contentResult.Content;
break;
// 处理对象结果
case ObjectResult objectResult:
data = objectResult.Value;
break;
case EmptyResult:
data = null;
break;
default:
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 = DateTime.Now.Millisecond
});
}
public IActionResult OnValidateFailed(ActionExecutingContext context, ValidationMetadata metadata)
{
if (context?.ActionDescriptor?.EndpointMetadata?.Any(a => a is JoinValidateMessgeAttribute) ?? false)
{
if (metadata?.ValidationResult is Dictionary<string, string[]> keyValuePairs)
{
string message = string.Join('', keyValuePairs.SelectMany(k => k.Value));
return new JsonResult(new XnRestfulResult<object>
{
Code = StatusCodes.Status400BadRequest,
Success = false,
Data = null,
Message = message,
Extras = UnifyContext.Take(),
Timestamp = DateTime.Now.Millisecond
});
}
}
return new JsonResult(new XnRestfulResult<object>
{
Code = StatusCodes.Status400BadRequest,
Success = false,
Data = null,
Message = metadata.ValidationResult,
Extras = UnifyContext.Take(),
Timestamp = DateTime.Now.Millisecond
});
}
public async Task OnResponseStatusCodes(HttpContext context, int statusCode, UnifyResultSettingsOptions unifyResultSettings = null)
{
Console.WriteLine("OnResponseStatusCodes");
// 设置响应状态码
UnifyContext.SetResponseStatusCodes(context, statusCode, unifyResultSettings);
if (Enum.IsDefined(typeof(HttpStatusCode), (HttpStatusCode)statusCode))
{
await context.Response.WriteAsJsonAsync(new XnRestfulResult<object>
{
Code = statusCode,
Success = false,
Data = null,
Message = EnumUtil.GetDescription((HttpStatusCode)statusCode),
Extras = UnifyContext.Take(),
Timestamp = DateTime.Now.Millisecond
});
}
}
}
/// <summary>
/// RESTful风格---XIAONUO返回格式
/// </summary>
/// <typeparam name="T"></typeparam>
[SuppressSniffer]
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; }
}