Blame view

netcore/src/Infrastructure/NCC/UnifyResult/Providers/RESTfulResultProvider.cs 3.65 KB
de2bd2f9   “wangming”   项目初始化
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
  using NCC.DataValidation;
  using NCC.Dependency;
  using NCC.UnifyResult.Internal;
  using Microsoft.AspNetCore.Http;
  using Microsoft.AspNetCore.Mvc;
  using Microsoft.AspNetCore.Mvc.Filters;
  using System;
  using System.Threading.Tasks;
  
  namespace NCC.UnifyResult
  {
      /// <summary>
      /// RESTful 风格返回值
      /// </summary>
      [SuppressSniffer, UnifyModel(typeof(RESTfulResult<>))]
      public class RESTfulResultProvider : IUnifyResultProvider
      {
          /// <summary>
          /// 异常返回值
          /// </summary>
          /// <param name="context"></param>
          /// <param name="metadata"></param>
          /// <returns></returns>
          public IActionResult OnException(ExceptionContext context, ExceptionMetadata metadata)
          {
              return new JsonResult(RESTfulResult(metadata.StatusCode, errors: metadata.Errors));
          }
  
          /// <summary>
          /// 成功返回值
          /// </summary>
          /// <param name="context"></param>
          /// <param name="data"></param>
          /// <returns></returns>
          public IActionResult OnSucceeded(ActionExecutedContext context, object data)
          {
              return new JsonResult(RESTfulResult(StatusCodes.Status200OK, true, data, errors: "操作成功"));
          }
  
          /// <summary>
          /// 验证失败返回值
          /// </summary>
          /// <param name="context"></param>
          /// <param name="metadata"></param>
          /// <returns></returns>
          public IActionResult OnValidateFailed(ActionExecutingContext context, ValidationMetadata metadata)
          {
              return new JsonResult(RESTfulResult(StatusCodes.Status400BadRequest, errors: metadata.ValidationResult));
          }
  
          /// <summary>
          /// 特定状态码返回值
          /// </summary>
          /// <param name="context"></param>
          /// <param name="statusCode"></param>
          /// <param name="unifyResultSettings"></param>
          /// <returns></returns>
          public async Task OnResponseStatusCodes(HttpContext context, int statusCode, UnifyResultSettingsOptions unifyResultSettings)
          {
              // 设置响应状态码
              UnifyContext.SetResponseStatusCodes(context, statusCode, unifyResultSettings);
  
              switch (statusCode)
              {
                  // 处理 401 状态码
                  case StatusCodes.Status401Unauthorized:
                      await context.Response.WriteAsJsonAsync(RESTfulResult(600, errors: "登录过期,请重新登录")
                          , App.GetOptions<JsonOptions>()?.JsonSerializerOptions);
                      break;
                  // 处理 403 状态码
                  case StatusCodes.Status403Forbidden:
                      await context.Response.WriteAsJsonAsync(RESTfulResult(statusCode, errors: "403 Forbidden")
                          , App.GetOptions<JsonOptions>()?.JsonSerializerOptions);
                      break;
  
                  default: break;
              }
          }
  
          /// <summary>
          /// 返回 RESTful 风格结果集
          /// </summary>
          /// <param name="statusCode"></param>
          /// <param name="succeeded"></param>
          /// <param name="data"></param>
          /// <param name="errors"></param>
          /// <returns></returns>
          private static RESTfulResult<object> RESTfulResult(int statusCode, bool succeeded = default, object data = default, object errors = default)
          {
              return new RESTfulResult<object>
              {
                  code = statusCode,
                  data = data,
                  msg = errors,
                  extras = UnifyContext.Take(),
                  timestamp = DateTimeOffset.UtcNow.ToUnixTimeMilliseconds()
              };
          }
      }
  }