using Furion.DataValidation;
|
using Furion.DependencyInjection;
|
using Furion.FriendlyException;
|
using Furion.UnifyResult;
|
//using Furion.UnifyResult.Internal;
|
using Microsoft.AspNetCore.Http;
|
using Microsoft.AspNetCore.Mvc;
|
using Microsoft.AspNetCore.Mvc.Filters;
|
using System.Net;
|
using Yw.Untity;
|
using Yw.Application;
|
using Yw.Dto;
|
using System.Text.Json.Serialization;
|
using System.Text.Json;
|
|
namespace IStation.WebApi
|
{
|
/// <summary>
|
/// 规范化RESTful风格返回值
|
/// </summary>
|
[SuppressSniffer, UnifyModel(typeof(Result<>))]
|
public class XnRestfulResultProvider : IUnifyResultProvider
|
{
|
/// <summary>
|
/// 异常
|
/// </summary>
|
public IActionResult OnException(ExceptionContext context, ExceptionMetadata metadata)
|
{
|
// 解析异常信息
|
//var exceptionMetadata = UnifyContext.GetExceptionMetadata(context);
|
|
Result<object> result = null;
|
|
//furion异常
|
if (context.Exception is AppFriendlyException friendException)
|
{
|
result = new Result<object>
|
{
|
Code = eResultCode.Alert,
|
Error = friendException.ErrorCode,
|
Message = friendException.ErrorMessage,
|
Data = null,
|
Extras = UnifyContext.Take(),
|
Timestamp = DateTime.Now
|
};
|
}
|
|
//api异常
|
else if (context.Exception is InternalException apiException)
|
{
|
result = new Result<object>
|
{
|
Code = apiException.ResultCode,
|
Error = apiException.ErrorCode,
|
Message = apiException.ErrorMsg,
|
Data = apiException.LogicData,
|
Extras = UnifyContext.Take(),
|
Timestamp = DateTime.Now
|
};
|
}
|
|
else
|
{
|
result = new Result<object>
|
{
|
Code = eResultCode.Error,
|
Error = "系统异常",
|
Message = context.Exception.StackTrace,
|
Data = null,
|
Extras = UnifyContext.Take(),
|
Timestamp = DateTime.Now
|
};
|
}
|
|
if (result.Code == eResultCode.Error)
|
{
|
Yw.LogHelper.Error($"错误码:{result.Error},错误信息:{result.Message}");
|
}
|
|
return new JsonResult(result);
|
}
|
|
/// <summary>
|
/// 成功
|
/// </summary>
|
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 Result<object>
|
{
|
Code = eResultCode.Success,
|
Error = null,
|
Message = "请求成功",
|
Data = data,
|
Extras = UnifyContext.Take(),
|
Timestamp = DateTime.Now
|
});
|
}
|
|
/// <summary>
|
/// 验证失败
|
/// </summary>
|
public IActionResult OnValidateFailed(ActionExecutingContext context, ValidationMetadata metadata)
|
{
|
return new JsonResult(new Result<object>
|
{
|
Code = eResultCode.Prompt,
|
Error = InternalErrorCodes.V001.ToString(),
|
Message = metadata.Message,
|
Data = null,
|
Extras = UnifyContext.Take(),
|
Timestamp = DateTime.Now
|
});
|
}
|
|
/// <summary>
|
/// 响应状态码
|
/// </summary>
|
public async Task OnResponseStatusCodes(HttpContext context, int statusCode, UnifyResultSettingsOptions unifyResultSettings = null)
|
{
|
// 设置响应状态码
|
UnifyContext.SetResponseStatusCodes(context, statusCode, unifyResultSettings);
|
var options = new JsonSerializerOptions();
|
options.PropertyNamingPolicy = null; //返回属性大小写问题
|
options.ReferenceHandler = ReferenceHandler.IgnoreCycles; //忽略循环引用 仅.NET 6支持
|
options.Converters.Add(new DateTimeJsonConverter());//时间格式处理
|
options.Converters.Add(new DateTimeNullableJsonConverter());//时间格式处理
|
options.Converters.Add(new LongJsonConverter());//长整型格式处理
|
options.Converters.Add(new LongNullableJsonConverter());//长整型格式处理
|
if (Enum.IsDefined(typeof(HttpStatusCode), (HttpStatusCode)statusCode))
|
{
|
await context.Response.WriteAsJsonAsync(new Result<object>
|
{
|
Code = eResultCode.Confirm,
|
Error = InternalErrorCodes.A099.ToString(),
|
Message = "权限验证失败",
|
Data = null,
|
Extras = UnifyContext.Take(),
|
Timestamp = DateTime.Now
|
}, options);
|
}
|
}
|
}
|
|
|
}
|