2021-04-30 14:52:42 +08:00
|
|
|
|
using Furion.DataValidation;
|
|
|
|
|
|
using Furion.DependencyInjection;
|
|
|
|
|
|
using Furion.UnifyResult;
|
2021-07-30 10:02:44 +08:00
|
|
|
|
using Furion.UnifyResult.Internal;
|
2021-04-30 14:52:42 +08:00
|
|
|
|
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.Linq;
|
|
|
|
|
|
using System.Text;
|
|
|
|
|
|
using System.Threading.Tasks;
|
|
|
|
|
|
|
|
|
|
|
|
namespace Waste.Web.Core
|
|
|
|
|
|
{
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// RESTFUL 风格返回值
|
|
|
|
|
|
/// </summary>
|
2021-07-30 10:02:44 +08:00
|
|
|
|
[SuppressSniffer, UnifyModel(typeof(RESTfulResult<>))]
|
2021-04-30 14:52:42 +08:00
|
|
|
|
public class RESTfulResultProvider : IUnifyResultProvider
|
|
|
|
|
|
{
|
2021-07-30 10:02:44 +08:00
|
|
|
|
|
2021-04-30 14:52:42 +08:00
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 异常返回值
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="context"></param>
|
2021-07-30 10:02:44 +08:00
|
|
|
|
/// <param name="metadata"></param>
|
2021-04-30 14:52:42 +08:00
|
|
|
|
/// <returns></returns>
|
2021-07-30 10:02:44 +08:00
|
|
|
|
public IActionResult OnException(ExceptionContext context, ExceptionMetadata metadata)
|
2021-04-30 14:52:42 +08:00
|
|
|
|
{
|
|
|
|
|
|
//解析异常信息
|
2021-07-30 10:02:44 +08:00
|
|
|
|
var ErrorCode = metadata.ErrorCode;
|
|
|
|
|
|
var StatusCode = metadata.StatusCode;
|
|
|
|
|
|
var Errors = metadata.Errors;
|
2021-05-27 16:58:40 +08:00
|
|
|
|
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 data= null;
|
2021-04-30 14:52:42 +08:00
|
|
|
|
return new JsonResult(new RESTfulResult<object>
|
|
|
|
|
|
{
|
|
|
|
|
|
StatusCode = StatusCode,
|
|
|
|
|
|
Succeeded = false,
|
2021-05-27 16:58:40 +08:00
|
|
|
|
Data = data,
|
2021-04-30 14:52:42 +08:00
|
|
|
|
Errors = Errors,
|
|
|
|
|
|
Extras = UnifyContext.Take(),
|
|
|
|
|
|
Timestamp = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 处理输出状态码
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="context"></param>
|
|
|
|
|
|
/// <param name="statusCode"></param>
|
2021-07-30 10:02:44 +08:00
|
|
|
|
/// <param name="unifyResultSettings"></param>
|
2021-04-30 14:52:42 +08:00
|
|
|
|
/// <returns></returns>
|
2021-07-30 10:02:44 +08:00
|
|
|
|
public async Task OnResponseStatusCodes(HttpContext context, int statusCode, UnifyResultSettingsOptions unifyResultSettings)
|
2021-04-30 14:52:42 +08:00
|
|
|
|
{
|
2021-07-30 10:02:44 +08:00
|
|
|
|
// 设置响应状态码
|
|
|
|
|
|
UnifyContext.SetResponseStatusCodes(context, statusCode, unifyResultSettings);
|
2021-04-30 14:52:42 +08:00
|
|
|
|
switch (statusCode)
|
|
|
|
|
|
{
|
|
|
|
|
|
// 处理 401 状态码
|
|
|
|
|
|
case StatusCodes.Status401Unauthorized:
|
|
|
|
|
|
await context.Response.WriteAsJsonAsync(new RESTfulResult<object>
|
|
|
|
|
|
{
|
|
|
|
|
|
StatusCode = StatusCodes.Status401Unauthorized,
|
|
|
|
|
|
Succeeded = false,
|
|
|
|
|
|
Data = null,
|
|
|
|
|
|
Errors = "401 Unauthorized",
|
|
|
|
|
|
Extras = UnifyContext.Take(),
|
|
|
|
|
|
Timestamp = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()
|
|
|
|
|
|
});
|
|
|
|
|
|
break;
|
|
|
|
|
|
// 处理 403 状态码
|
|
|
|
|
|
case StatusCodes.Status403Forbidden:
|
|
|
|
|
|
await context.Response.WriteAsJsonAsync(new RESTfulResult<object>
|
|
|
|
|
|
{
|
|
|
|
|
|
StatusCode = StatusCodes.Status403Forbidden,
|
|
|
|
|
|
Succeeded = false,
|
|
|
|
|
|
Data = null,
|
|
|
|
|
|
Errors = "403 Forbidden",
|
|
|
|
|
|
Extras = UnifyContext.Take(),
|
|
|
|
|
|
Timestamp = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()
|
|
|
|
|
|
});
|
|
|
|
|
|
break;
|
|
|
|
|
|
|
|
|
|
|
|
default:
|
|
|
|
|
|
break;
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 成功返回值
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="context"></param>
|
2021-07-30 10:02:44 +08:00
|
|
|
|
/// <param name="data"></param>
|
2021-04-30 14:52:42 +08:00
|
|
|
|
/// <returns></returns>
|
2021-07-30 10:02:44 +08:00
|
|
|
|
public IActionResult OnSucceeded(ActionExecutedContext context, object data)
|
2021-04-30 14:52:42 +08:00
|
|
|
|
{
|
|
|
|
|
|
// 处理内容结果
|
|
|
|
|
|
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 RESTfulResult<object>
|
|
|
|
|
|
{
|
|
|
|
|
|
StatusCode = context.Result is EmptyResult ? StatusCodes.Status204NoContent : StatusCodes.Status200OK, // 处理没有返回值情况 204
|
|
|
|
|
|
Succeeded = true,
|
|
|
|
|
|
Data = data,
|
|
|
|
|
|
Errors = null,
|
|
|
|
|
|
Extras = UnifyContext.Take(),
|
|
|
|
|
|
Timestamp = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
/// <summary>
|
|
|
|
|
|
/// 验证失败返回值
|
|
|
|
|
|
/// </summary>
|
|
|
|
|
|
/// <param name="context"></param>
|
2021-07-30 10:02:44 +08:00
|
|
|
|
/// <param name="metadata"></param>
|
2021-04-30 14:52:42 +08:00
|
|
|
|
/// <returns></returns>
|
2021-07-30 10:02:44 +08:00
|
|
|
|
public IActionResult OnValidateFailed(ActionExecutingContext context, ValidationMetadata metadata)
|
2021-04-30 14:52:42 +08:00
|
|
|
|
{
|
2021-07-30 10:02:44 +08:00
|
|
|
|
var msg = "发生错误";
|
|
|
|
|
|
var validationResults = metadata.ValidationResult;
|
|
|
|
|
|
if (validationResults != null && validationResults.Count() > 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
var messages = validationResults.FirstOrDefault().Value;
|
|
|
|
|
|
if (messages.Length > 0)
|
|
|
|
|
|
{
|
|
|
|
|
|
msg = messages[0];
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
2021-04-30 14:52:42 +08:00
|
|
|
|
return new JsonResult(new RESTfulResult<object>
|
|
|
|
|
|
{
|
|
|
|
|
|
StatusCode = StatusCodes.Status400BadRequest,
|
|
|
|
|
|
Succeeded = false,
|
|
|
|
|
|
Data = null,
|
2021-07-30 10:02:44 +08:00
|
|
|
|
Errors = msg,
|
2021-04-30 14:52:42 +08:00
|
|
|
|
Extras = UnifyContext.Take(),
|
|
|
|
|
|
Timestamp = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()
|
|
|
|
|
|
});
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|