.NET Core统一参数校验、异常处理、结果返回

我们开发接口时,一般都会涉及到参数校验、异常处理、封装结果返回等处理。如果每个后端开发在参数校验、异常处理等都是各写各的,没有统一处理的话,代码就不优雅,也不容易维护。所以,我们需要统一校验参数,统一异常处理、统一结果返回,让代码更加规范、可读性更强、更容易维护。

统一参数校验

比如我们需要入参为必填,只需要在实体类字段添加  [Required]

/// <summary>////// </summary>public class AdminInputDto{/// <summary>/// 账号/// </summary>[Required]public string UserName { get; set; }/// <summary>/// 密码/// </summary>[Required]public string Password { get; set; }}

然后再OnActionExecuting 进行验证

public override void OnActionExecuting(ActionExecutingContext context){//模型验证if (!context.ModelState.IsValid){throw new CustomException(context.ModelState.Values.First(p => p.Errors.Count > 0).Errors[0].ErrorMessage, ReturnCode.E1000002);}base.OnActionExecuting(context);}

统一结果返回

统一标准的返回格式。一般一个标准的响应报文对象

code :响应状态码

message :响应结果描述

data:返回的数据

定义一个统一的返回对象模板

/// <summary>/// Service的返回数据/// </summary>public class ReturnData : ReturnData<object>{}/// <summary>/// Service的返回数据/// </summary>public class ReturnData<T>{/// <summary>/// 返回码/// </summary>public ReturnCode Code { get; set; }/// <summary>/// 消息/// </summary>public string Message { get; set; }/// <summary>/// 结果数据/// </summary>public T Data { get; set; }/// <summary>/// 判断处理是否成功/// </summary>public bool Success{get { return ReturnCode.E10000 == Code; }}}

在控制器返回的时候,进行返回包装

/// <summary>/// 处理正常返回的结果对象/// </summary>/// <param name="context"></param>public override void OnActionExecuted(ActionExecutedContext context){if (context.Result != null){var serializerSettings = new JsonSerializerSettings{DateTimeZoneHandling = DateTimeZoneHandling.Local,DateFormatString = "yyyy-MM-ddTHH:mm:ss.fffzz:00",//设置缩进Formatting = Formatting.Indented,//设置json格式为驼峰式ContractResolver = new CamelCasePropertyNamesContractResolver()};var result = context.Result as ObjectResult;JsonResult newresult;if (context.Result is ObjectResult){newresult = new JsonResult(new ReturnData { Message = "操作成功!", Code = ReturnCode.E10000, Data = result.Value }, serializerSettings);}else if (context.Result is EmptyResult){newresult = new JsonResult(new ReturnData { Message = "操作成功!", Code = ReturnCode.E10000 }, serializerSettings);}else{throw new Exception($"未经处理的Result类型:{ context.Result.GetType().Name}");}context.Result = newresult;}base.OnActionExecuted(context);}

统一异常处理

遇到未处理的异常进行统一的封装

/// <summary>/// api异常统一处理过滤器/// </summary>public class ApiExceptionFilterAttribute : ExceptionFilterAttribute{public override void OnException(ExceptionContext context){context.Result = BuildExceptionResult(context.Exception);base.OnException(context);}/// <summary>/// 包装处理异常格式/// </summary>/// <param name="ex"></param>/// <returns></returns>private JsonResult BuildExceptionResult(Exception ex){var returnData = new ReturnData();var exresult = ex as CustomException;var WriteLog = true;if (exresult != null){//异常为自定义的异常returnData.Code = exresult.ErrorCode;returnData.Message = exresult.Message;WriteLog = exresult.WriteLog;}else{//异常为未知异常returnData.Code = ReturnCode.E1000001;returnData.Message = ex.Message;}//TODO 日志var serializerSettings = new JsonSerializerSettings{DateTimeZoneHandling = DateTimeZoneHandling.Local,DateFormatString = "yyyy-MM-ddTHH:mm:ss.fffzz:00",//设置缩进Formatting = Formatting.Indented,//设置json格式为驼峰式ContractResolver = new CamelCasePropertyNamesContractResolver()};return new JsonResult(returnData, serializerSettings);}}
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/281105.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Memcached 在linux上安装笔记

第一种yum 方式安装 Memcached 支持许多平台&#xff1a;Linux、FreeBSD、Solaris、Mac OS&#xff0c;也可以安装在Windows上。 第一步 Linux系统安装memcached&#xff0c;首先要先安装libevent库 Ubuntu/Debian sudo apt-get install libevent libevent-deve 自动下…

onlyoffice回调函数controller方式实现

原文同步自作者博客&#xff1a;https://www.daxueyiwu.com/post/706 springboot实现的onlyoffice协同编辑网盘项目可以去作者博客。 上代码&#xff1a; //新建报告GetMapping("report/createReport")public String CreatReport(HttpServletRequest request,Stri…

读Bilgin Ibryam 新作 《Dapr 是一种10倍数 平台》

Bilgin Ibryam 最近加入了开发者软件初创公司Diagrid Inc&#xff0c;他是Apache Software Foundation 的 committer 和成员。他也是一个开源的布道师&#xff0c;并且是书籍 Kubernetes设计模式 和 Camel Design Patterns 的作者。早在2020年初 提出的Multi-Runtime Microserv…

如何在iPhone或iPad上使用Safari下载文件

Khamosh PathakKhamosh PathakIn your work or personal life, you’ll sometimes need to download a file on your iPhone or iPad. Using the new feature introduced in iOS 13 and iPadOS 13, you can now do this directly in Safari. No third-party app needed! 在工作…

java版左右手桌面盯盘软件dstock V1.0

V1.0功能比较简陋&#xff0c;先满足自己桌面盯盘需要 V1.0 版本功能介绍&#xff1a; 1. 1s实时刷新盯盘数据 主要市面上的&#xff0c;符合我要求的桌面应用要VIP,穷啊&#xff0c;还是月月付&#xff0c;年年付&#xff0c;还是自己搞吧&#xff01; 2. 配置文件配置股票…

放大倍数超5万倍的Memcached DDoS反射攻击,怎么破?

欢迎大家前往腾讯云社区&#xff0c;获取更多腾讯海量技术实践干货哦~ 作者&#xff1a;腾讯游戏云 背景&#xff1a;Memcached攻击创造DDoS攻击流量纪录 近日&#xff0c;利用Memcached服务器实施反射DDoS攻击的事件呈大幅上升趋势。DDoS攻击流量首次过T&#xff0c;引发业界热…

C# WPF TabControl控件用法详解

概述TabControl我之前有讲过一节&#xff0c;内容详见&#xff1a;C# WPF TabControl用法指南(精品)&#xff0c;上节主要讲解了tabcontrol控件的左右翻页&#xff0c;以及页面筛选&#xff0c;以及数据绑定等内容&#xff0c;这节内容继续接续上节内容进行扩展讲解&#xff0c…

pixel 解锁_如何在Google Pixel 4和Pixel 4 XL上禁用面部解锁

pixel 解锁Justin Duino贾斯汀杜伊诺(Justin Duino)Face Unlock is one of the Google Pixel 4 and Pixel 4 XL’s flagship features. But if the facial recognition is a form of biometric security you’re uncomfortable with, you can delete your face data right off …

【实战】将多个不规则多级表头的工作表合并为一个规范的一维表数据结果表...

最近在项目里&#xff0c;有个临时的小需求&#xff0c;需要将一些行列交叉结构的表格进行汇总合并&#xff0c;转换成规范的一维表数据结构进行后续的分析使用。从一开始想到的使用VBA拼接字符串方式&#xff0c;完成PowerQuery的M语言查询字符串&#xff0c;然后转换成使用插…

#if defined(__cplusplus)

由于C编译器需要支持函数的重载&#xff0c;会改变函数的名称&#xff0c;因此dll的导出函数通常是标准C定义的。这就使得C和C的互相调用变得很常见。但是有时可能又会直接用C来调用&#xff0c;不想重新写代码&#xff0c;让标准C编写的dll函数定义在C和C编译器下都能编译通过…

happiness[国家集训队2011(吴确)]

【试题来源】 2011中国国家集训队命题答辩【问题描述】 高一一班的座位表是个n*m的矩阵&#xff0c;经过一个学期的相处&#xff0c;每个同学和前后左右相邻的同学互相成为了好朋友。这学期要分文理科了&#xff0c;每个同学对于选择文科与理科有着自己的喜悦值&#xff0c;而一…

sketch怎么移动图层_什么是Photoshop Express,Fix,Mix和Sketch移动应用程序?

sketch怎么移动图层Adobe’s approach to mobile apps seems to be “The More, The Better”. Right now, there are five Photoshop branded apps available for iOS and Android. Adobe的移动应用程序方法似乎是“越多越好”。 目前&#xff0c;有五个适用于iOS和Android的P…

imessage_如何在iPhone和iPad上的iMessage组中提及某人

imessageKhamosh PathakKhamosh PathakSometimes, it’s difficult to get someone’s attention in a large iMessage group chat on your iPhone or iPad. However, if you mention that person specifically in a message, your friend will receive a notification about i…

点击右侧导航栏,实现iframe嵌入子页面中div,滑动到最上面

2019独角兽企业重金招聘Python工程师标准>>> // 点击对应的nav里的li标签,页面就滚动到哪里 $(.title-list > li).click(function(event) {$(this).addClass(active).siblings().removeClass(active);//li标签里面有a标签,可以阻止到a标签的默认行为event.preven…

wepack环境配置1之node的安装

.向往已久的webpack终于配好了.. 1.要安装webpack&#xff0c;首先需要安装nodejs nodejs下载地址:https://nodejs.org/en/ 下载完成后,一步步安装即可,我是安装到D盘 新建一个nodejs的文件夹,装到这个文件夹里面即可. 安装完毕后检查自己是否安装成功.启动cmd,然后输入npm -v,…

【赏析】.NET跨平台框架-Avalonia UI

这是Avalonia UI官方的一个Demo&#xff0c;站长对部分Nuget包进行了升级&#xff0c;网友【小飞机MLA】对Linux版本修复了字体Bug得以正常运行、演示&#xff1a;Windows 11&#xff1a;macOS 13&#xff1a;可安装Rider&#xff08;EAP即要&#xff09;开发&#xff0c;站长一…

Kernel Newbies内核开发新手的资源

Jessica McKellar在Ksplice blog上的博客文章《Linux Device Drivers》如果你在写一个操作系统&#xff0c;OSDev wiki是一个不错的网站Kernel Newbies内核开发新手的资源

office自定义安装选项_如何自定义Office 2013中功能区上的现有选项卡

office自定义安装选项The Ribbon in Microsoft Office 2013 provides quick access to many features and options by default, but it can be further customized to fit the way you use it. You can add a custom tab to the ribbon or you can add commands to the existin…

Centos6.8 安装spark-2.3.1 以及 scala-2.12.2

一、Spark概述 Spark 是一个用来实现快速而通用的集群计算的平台。 在速度方面&#xff0c;Spark 扩展了广泛使用的 MapReduce 计算模型&#xff0c;而且高效地支持更多计算模式&#xff0c;包括交互式查询和流处理。 在处理大规模数据集时&#xff0c;速度是非常重要的。速…

聊一聊 WPF 程序的键盘是如何被窃听的?

一&#xff1a;背景 1.讲故事前几天群里很热闹&#xff0c;看了下在争论两个问题&#xff1a;电脑里要不要装杀毒软件 ?应该装什么杀毒软件 ?不管杀毒软件流氓不流氓&#xff0c;在如今病毒肆虐的当下互联网&#xff0c;装一个还是能帮我们拦截很多意想不到的东西&#xff0c…