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;
|
|
namespace Yw.WebApi
|
{
|
/// <summary>
|
/// 规范化RESTful风格返回值
|
/// </summary>
|
[SuppressSniffer, UnifyModel(typeof(XnRestfulResult<>))]
|
public class XnRestfulResultProvider : IUnifyResultProvider
|
{
|
/// <summary>
|
/// 异常
|
/// </summary>
|
public IActionResult OnException(ExceptionContext context, ExceptionMetadata metadata)
|
{
|
// 解析异常信息
|
var exceptionMetadata = UnifyContext.GetExceptionMetadata(context);
|
|
return new JsonResult(new XnRestfulResult<object>
|
{
|
Code = XnRestfulResultCode.Error,
|
Message = exceptionMetadata.Errors,
|
Data = exceptionMetadata.StatusCode,
|
Extras = UnifyContext.Take(),
|
Timestamp = DateTime.Now
|
});
|
}
|
|
/// <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 XnRestfulResult<object>
|
{
|
Code = XnRestfulResultCode.Success,
|
Message = "请求成功",
|
Data = data,
|
Extras = UnifyContext.Take(),
|
Timestamp = DateTime.Now
|
});
|
}
|
|
/// <summary>
|
/// 验证失败
|
/// </summary>
|
public IActionResult OnValidateFailed(ActionExecutingContext context, ValidationMetadata metadata)
|
{
|
return new JsonResult(new XnRestfulResult<object>
|
{
|
Code = XnRestfulResultCode.Prompt,
|
Message = metadata.ValidationResult,
|
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);
|
|
if (Enum.IsDefined(typeof(HttpStatusCode), (HttpStatusCode)statusCode))
|
{
|
await context.Response.WriteAsJsonAsync(new XnRestfulResult<object>
|
{
|
Code = XnRestfulResultCode.Alert,
|
Message = EnumUtil.GetDescription((HttpStatusCode)statusCode),
|
Data = statusCode,
|
Extras = UnifyContext.Take(),
|
Timestamp = DateTime.Now
|
});
|
}
|
}
|
}
|
|
|
}
|