using Microsoft.AspNetCore.Mvc.Filters; using Microsoft.AspNetCore.Mvc; using Microsoft.Extensions.Caching.Distributed; using System.Net; using Microsoft.AspNetCore.Authorization; using Microsoft.AspNetCore.Http; using EasyTemplate.Tool; using EasyTemplate.Tool.Entity; using EasyTemplate.Tool.Util; namespace EasyTemplate.Service; /// /// 全局异常 /// public class ApiExceptionAttribute : Attribute, IExceptionFilter { public void OnException(ExceptionContext context) { Cache.Increase($"request_error_{DateTime.Now.ToString("yyyyMMdd")}"); Log.Error(context.Exception); var ex = context.Exception as FriendlyException; if (ex != null) { switch (ex.StatusCode) { //处理400状态码 case StatusCodes.Status400BadRequest: context.Result = new JsonResult(Result.Fail((HttpStatusCode)ex.StatusCode, ex.ValidationException ? ex.ErrorMessage.ToString() : "400 请求失败", false)); context.ExceptionHandled = true; break; //处理401状态码 case StatusCodes.Status401Unauthorized: context.Result = new JsonResult(Result.Fail((HttpStatusCode)ex.StatusCode, "401 登录已过期,请重新登录", false)); context.ExceptionHandled = true; break; //处理403状态码 case StatusCodes.Status403Forbidden: context.Result = new JsonResult(Result.Fail((HttpStatusCode)ex.StatusCode, "403 禁止访问,没有权限", false)); context.ExceptionHandled = true; break; //处理404状态码 case StatusCodes.Status404NotFound: context.Result = new JsonResult(Result.Fail((HttpStatusCode)ex.StatusCode, "404 未找到", false)); context.ExceptionHandled = true; break; //处理500状态码 case StatusCodes.Status500InternalServerError: context.Result = new JsonResult(Result.Fail((HttpStatusCode)ex.StatusCode, "500 内部服务器错误", false)); context.ExceptionHandled = true; break; case 600: context.Result = new JsonResult(Result.Fail(HttpStatusCode.BadRequest, $"{ex.ErrorCode} {ex.Message}", false)); context.ExceptionHandled = true; break; default: context.Result = new JsonResult(Result.Fail((HttpStatusCode)ex.StatusCode, $"{ex.StatusCode} 应用内错误", false)); context.ExceptionHandled = true; break; } } else { context.Result = new JsonResult(Result.Fail(Message: $"400 应用内错误", Data: false)); context.ExceptionHandled = true; } } } /// /// 实现自定义授权 /// public class ApiAuthorizeAttribute : Attribute, IAuthorizationFilter { /// /// 请求验证,当前验证部分不要抛出异常,ExceptionFilter不会处理 /// /// public void OnAuthorization(AuthorizationFilterContext context) { if (context.ActionDescriptor.EndpointMetadata.OfType().Any()) { Cache.Increase($"request_{DateTime.Now.ToString("yyyyMMdd")}"); Cache.Increase($"request_total"); return; } if (context.HttpContext.Response.StatusCode == 200) { string token = context.HttpContext.Request.Headers["Authorization"]; if (string.IsNullOrEmpty(token)) { context.Result = new JsonResult(Result.Fail(HttpStatusCode.Forbidden, "非法请求", false)); } else { try { token = token.Replace("Bearer ", ""); var info = Jwt.Deserialize(token, out DateTime expired); if (expired.Subtract(DateTime.Now).TotalSeconds > 0) { Global.UserId = info.UserId; Cache.Increase($"request_{DateTime.Now.ToString("yyyyMMdd")}"); Cache.Increase($"request_total"); context.HttpContext.Session.SetString("userid", info.UserId.ToString()); context.HttpContext.Session.SetString("username", info.Name); } else { context.Result = new JsonResult(Result.Fail(HttpStatusCode.Unauthorized, "token已过期", false)); } } catch { context.Result = new JsonResult(Result.Fail(HttpStatusCode.Unauthorized, "token格式不正确", false)); } } } else if (context.HttpContext.Response.StatusCode == 401) { context.Result = new JsonResult(Result.Fail(HttpStatusCode.Unauthorized, "请先登录", false)); } } } /// /// /// public class ApiResultAttribute : Attribute, IResultFilter { public void OnResultExecuted(ResultExecutedContext context) { // 在结果执行之后调用的操作... } public void OnResultExecuting(ResultExecutingContext context) { if (context.Result is BadRequestObjectResult vresult) { if (vresult.Value is ValidationProblemDetails detail) { context.Result = new JsonResult(new Result() { Code = HttpStatusCode.BadRequest, Message = "字段验证失败", Data = detail.Errors.ToList() }); return; } } if (context.Result is ObjectResult result) { context.Result = new JsonResult(new Result() { Code = (HttpStatusCode)context.HttpContext.Response.StatusCode, Message = "成功", Data = result?.Value }); return; } } }