NetCore WebApi AOP统一返回值设计

这篇具有很好参考价值的文章主要介绍了NetCore WebApi AOP统一返回值设计。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

实体

BaseResultModel
 public class BaseResultModel
    {
        public BaseResultModel(int? code = null, string message = null,
            object result = null, ReturnStatus returnStatus = ReturnStatus.Success)
        {
            this.Code = code;
            this.Result = result;
            this.Message = message;
            this.ReturnStatus = returnStatus;
        }

        public int? Code { get; set; }

        public string Message { get; set; }

        public object Result { get; set; }

        public ReturnStatus ReturnStatus { get; set; }
    }

    public enum ReturnStatus
    {
        Success = 1,
        Fail = 0,
        ConfirmIsContinue = 2,
        Error = 3
    }
ValidationFailedResult
  public class ValidationFailedResult : ObjectResult
    {
        public ValidationFailedResult(ModelStateDictionary modelState)
        : base(new ValidationFailedResultModel(modelState))
        {
            StatusCode = StatusCodes.Status422UnprocessableEntity;
        }
    }
ValidationFailedResultModel
 public class ValidationFailedResultModel : BaseResultModel
    {
        public ValidationFailedResultModel(ModelStateDictionary modelState)
        {
            Code = 422;
            Message = "参数不合法";
            Result = modelState.Keys.SelectMany(key => modelState[key].Errors.Select(x => new ValidationError(key, x.ErrorMessage))).ToList();
            ReturnStatus = ReturnStatus.Fail;
        }
    }

    public class ValidationError
    {
        [JsonProperty(NullValueHandling = NullValueHandling.Ignore)]
        public string Field { get; }

        public string Message { get; }

        public ValidationError(string field, string message)
        {
            Field = field != string.Empty ? field : null;
            Message = message;
        }
    }

过滤器

ApiResultFilterAttribute
 public class ApiResultFilterAttribute : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext context)
        {
            base.OnActionExecuting(context);
        }

        public override void OnResultExecuting(ResultExecutingContext context)
        {
            if (context.Result is ValidationFailedResult)
            {
                var objectResult = context.Result as ObjectResult;
                context.Result = objectResult;
            }
            else
            {
                var objectResult = context.Result as ObjectResult;
                if (objectResult == null)
                {
                    context.Result = new OkObjectResult(null);
                }
                else
                {
                    context.Result = new OkObjectResult(objectResult.Value);
                }
            }
        }
    }
ErrorFilter
  public class ErrorFilter : ExceptionFilterAttribute
    {
        public override void OnException(ExceptionContext context)
        {
            if (context.ExceptionHandled == false)
            {
                string ip = context.HttpContext?.Connection.RemoteIpAddress.ToString();
                string Url = context.HttpContext.Request.Path;
                string Mthods = context.HttpContext.Request.Method;
                context.ExceptionHandled = true;
                context.HttpContext.Response.StatusCode = 500;
                ExecuteResult executeResult = new ExecuteResult();
                executeResult.SetFailMessage(context.Exception.Message);
                context.Result = new OkObjectResult(executeResult);
                
            }
        }
    }
ValidateModelAttribute
 public class ValidateModelAttribute : ActionFilterAttribute
    {
        public override void OnActionExecuting(ActionExecutingContext context)
        {
            if (!context.ModelState.IsValid)
            {
                context.Result = new ValidationFailedResult(context.ModelState);
            }
        }

        public override void OnActionExecuted(ActionExecutedContext context)
        {
            base.OnActionExecuted(context);
        }
    }
 services.AddMvc(options =>
            {
                options.Filters.Add<ApiResultFilterAttribute>();
                options.Filters.Add<ValidateModelAttribute>();
                options.Filters.Add<ErrorFilter>();
            }

思考 如果我们这样的确确定了统一的返回值 但是又对代码有一定的入侵 是 统一返回好 还是说在控制器哪里创建返回值对象好呢?文章来源地址https://www.toymoban.com/news/detail-608323.html

到了这里,关于NetCore WebApi AOP统一返回值设计的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • .netframework迁移到.netcore方法

    一 .netframework程序迁移到.netcore5.0 对于.netframwork程序想要升级为.netcore5.0的方法,微软官方也给出了方法见 https://docs.microsoft.com/en-us/dotnet/desktop/winforms/migration/?view=netdesktop-5.0,我这里总结记录一下. 1.首先要检查自己应用程序适不适合迁移 .netframework框架和.netcore框架有很大的不同

    2024年02月04日
    浏览(26)
  • .netcore grpc双向流方法详解

    简单来讲客户端可以向服务端发送消息流,服务端也可以向客户端传输响应流,即客户端和服务端可以互相通讯 客户端无需发送消息即可开始双向流式处理调用 。 客户端可选择使用  RequestStream.WriteAsync  发送消息。 使用  ResponseStream.MoveNext()  或  ResponseStream.ReadAllAsync()  可

    2024年02月13日
    浏览(35)
  • .Net Core webapi RestFul 统一接口数据返回格式

    在RestFul风格盛行的年代,大部分接口都需要一套统一的数据返回格式,那么我们怎么才能保证使用统一的json数据格式返回呢,下面给大家简单介绍一下: 假如我们需要接口统一返回一下数据格式: json对象中data是返回的实际结果对象,可以是一个对象、一个list、一个字符串

    2024年01月16日
    浏览(36)
  • netcore控制反转

    IoC Ioc优点 接口IMyservice 实现接口类 配置依赖注入在Startup.cs中 在控制器中注入依赖项

    2024年02月17日
    浏览(37)
  • IIS 部署.NetCore

    https://dotnet.microsoft.com/download/dotnet/3.1/runtime Windows 安装,选择desktop apps 选择好版本后,点击去,找到Core运行时的支持:IIS runtime support,里面的Hosting Bundle(托管捆绑包)下载 设置无托管 参考地址 1、cmd输入命令,提示无法启动此程序,因为计算机中丢失 api-ms-win-crt-runtime-l

    2024年02月12日
    浏览(36)
  • 【NetCore】03-依赖注入

    管理类之间的依赖,帮助我们在构建应用时遵循设计原则,确保代码的可维护性和可扩展性 依赖注入框架提供了对象创建和生命周期管理的核心能力,各个组件相互协作,也是由依赖注入框架的能力来实现的 组件包 Microsoft.Extensions.DependencyInjection.Abstractions Microsoft.Extensions.

    2024年02月15日
    浏览(38)
  • netCore使用依赖注入

    依赖注入是一种常用的设计模式,用于解耦组件之间的依赖关系。通过依赖注入,我们可以将一个组件所依赖的其他组件的创建和管理工作交给容器来完成,从而实现组件之间的解耦和灵活性 .NET Core提供了内置的依赖注入容器,使我们能够轻松地实现依赖注入。下面是使用依

    2024年02月16日
    浏览(35)
  • 杨中科 .netcore 依赖注入

    生活中的“控制反转”:自己发电和用电网的电。 依赖注入(Dependency Injection,Dl)是控制反转:(Inversion of Control,l0c)思想的实现方式。 依赖注入简化模块的组装过程,降低模块之间的耦合度 缺点是? 你需要对一切流程很清楚。 \\\'怎样创建XX对象”----“我要XX对象 两种实现方式:

    2024年02月21日
    浏览(29)
  • netcore模型配置

    模型配置可以通过Fluent API和注解的方式 FluentAPI步骤 新建Products 和Category类 新建Products类 Products     新建Category类 Category 他们之间存在一对多的关系 配置实体属性 Fluent API  配置一对一的关系 一对一关系表示两个实体存在唯一的关系,每个实体只能关联到另一个实体 新建

    2024年02月16日
    浏览(35)
  • .netcore发布独立版部署

    .NetCore 在发布独立版时会打包独立环境,就算服务没有安装环境也能运行,这就是.NetCore跨平台的特性之一。 按照微软的传统配套,c#开发的项目一般都是发布打包程序部署在iis,但是.netcore 跨平台的,就是说当发布独立版时可以跨平台部署。 在发布独立版是,会把项目中的

    2024年02月11日
    浏览(47)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包