asp.net core 自定义401和异常显示内容(JWT认证、Cookie Base认证失败显示内容)
asp.net core 2.0使用JWT认证园子里已经有挺多帖子了,但开发中发现认证未授权情况下返回的401状态码是没有任何信息的,业务中可能有需要返回一串错误的Json信息。在这里我分享一个自定义错误页面内容信息的方法,使用该扩展方法还可以捕获异常,将异常信息也转为json。
1.新建一个Api接口统一返回类ApiResult.cs(可替换成自己的)。
using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks;namespace Jom.WebApi.Config {public class ApiResult{public bool Success { get; set; } = true;public string Msg { get; set; } = "";public string Type { get; set; } = "";public object Data { get; set; } = "";public object DataExt { get; set; } = "";} }
2.建立中间件ErrorHandlingMiddleware.cs
using Microsoft.AspNetCore.Builder; using Microsoft.AspNetCore.Http; using Newtonsoft.Json; using System; using System.Collections.Generic; using System.Linq; using System.Threading.Tasks;namespace Jom.WebApi.Config {public class ErrorHandlingMiddleware{private readonly RequestDelegate next;public ErrorHandlingMiddleware(RequestDelegate next){this.next = next;}public async Task Invoke(HttpContext context){try{await next(context);}catch (Exception ex){var statusCode = context.Response.StatusCode;if (ex is ArgumentException){statusCode = 200;}await HandleExceptionAsync(context, statusCode, ex.Message);}finally{var statusCode = context.Response.StatusCode;var msg = "";if (statusCode == 401){msg = "未授权";}else if (statusCode == 404){msg = "未找到服务";}else if (statusCode == 502){msg = "请求错误";}else if (statusCode != 200){msg = "未知错误";}if (!string.IsNullOrWhiteSpace(msg)){await HandleExceptionAsync(context, statusCode, msg);}}}//异常错误信息捕获,将错误信息用Json方式返回private static Task HandleExceptionAsync(HttpContext context, int statusCode, string msg){var result = JsonConvert.SerializeObject(new ApiResult() { Success=false,Msg=msg,Type= statusCode.ToString() });context.Response.ContentType = "application/json;charset=utf-8";return context.Response.WriteAsync(result);}}//扩展方法public static class ErrorHandlingExtensions{public static IApplicationBuilder UseErrorHandling(this IApplicationBuilder builder){return builder.UseMiddleware<ErrorHandlingMiddleware>();}} }
3.最后只要在Startup.cs中的Configure方法中加上一句,在Startup.cs中添加引用using Jom.WebApi.Config;使用扩展方法ErrorHandlingExtensions()使用错误码处理中间件。
//请求错误提示配置app.UseErrorHandling();
完整的Configure方法
public void Configure(IApplicationBuilder app, IHostingEnvironment env){if (env.IsDevelopment()){app.UseDeveloperExceptionPage();}//请求错误提示配置 app.UseErrorHandling();//使用认证授权 app.UseAuthentication();//使用mvcapp.UseMvc(routes =>{routes.MapRoute(name: "default",template: "api/{controller}/{action}/{id?}",defaults: new { controller = "Values", action = "Get" });});}
最后就完成了自定义401页面内容,同时还可以定义其他状态码如403,404,502,503等等,同时api接口报异常也将转化为特定的JSON格式。
postman中请求返回
转载于:https://www.cnblogs.com/jomzhang/p/9253647.html
asp.net core 自定义401和异常显示内容(JWT认证、Cookie Base认证失败显示内容)相关推荐
- asp.net core 自定义 Policy 替换 AllowAnonymous 的行为
asp.net core 自定义 Policy 替换 AllowAnonymous 的行为 Intro 最近对我们的服务进行了改造,原本内部服务在内部可以匿名调用,现在增加了限制,通过 identit ...
- asp.Net Core免费开源分布式异常日志收集框架Exceptionless安装配置以及简单使用图文教程...
最近在学习张善友老师的NanoFabric 框架的时了解到Exceptionless : https://exceptionless.com/ !因此学习了一下这个开源框架!下面对Exceptionl ...
- asp.net core 自定义基于 HttpContext 的 Serilog Enricher
asp.net core 自定义基于 HttpContext 的 Serilog Enricher Intro 通过 HttpContext 我们可以拿到很多有用的信息,比如 Path/QuerySt ...
- ASP.NET Core 中间件Diagnostics使用 异常和错误信息
ASP.NET Core 中间件Diagnostics使用 异常和错误信息 参考文章: (1)ASP.NET Core 中间件Diagnostics使用 异常和错误信息 (2)https://www. ...
- 解决 ASP.NET Core 自定义错误页面对 Middleware 异常无效的问题
我们基于 Razor Class Library 实现了自定义错误页面的公用类库(详见之前的随笔),但是在实际使用时发现如果在 middleware 中发生了异常,则不能显示自定义错误页面,而是返回默 ...
- asp.net core 自定义 Content-Type
asp.net core 实现支持自定义 Content-Type Intro 我们最近有一个原本是内网的服务要上公网,在公网上有一层 Cloudflare 作为网站的公网流量提供者,CloudFla ...
- asp.net core web mvc之异常
与web api类似,asp.net core web mvc模板也是利用ExceptionHandler来处理错误,在starup的Configure配置数据发生时导向的/home/error pu ...
- asp.net core 自定义异常处理中间件
Intro 在 asp.net core 中全局异常处理,有时候可能不能满足我们的需要,可能就需要自己自定义一个中间件处理了,最近遇到一个问题,有一些异常,不希望记录错误日志,目前主要是用户请求取消导 ...
- asp.net core自定义依赖注入容器,替换自带容器
依赖注入 在asp.net core程序中,众所周知,依赖注入基本上贯穿了整个项目,以通用的结构来讲解,控制器层(Controller层)依赖业务层(Service层),业务层依赖于仓储层(Repos ...
最新文章
- 机器人控制与感知有感
- python拆堆和堆叠的操作_堆叠框架的Python / Tkinter退出按钮
- Java Excel 插入图片
- Kindeditor富文本编辑器使用
- Google Hangouts支持使用Firefox WebRTC
- bootloader启动流程分析
- 如何在一个月内让QQ农场冲上40级
- L101 L201 ME35 ME350 SX235W EP-801A ME535 清零软件
- BZOJ4011:[HNOI2015]落忆枫音(DP,拓扑排序)
- openssl SM2签名密钥生成
- 易飞ERP工作流解决方案之【第三方OA系统集成】
- Linux使用命令行工具管理用户和组
- python ffmpeg剪辑视频_FFMPEG剪辑大法
- 天津智慧路灯+“新基建”示范区建设启动、沪苏通长江公铁大桥
- 体验与对比新版EBS gp3 vs gp2
- 当Apple TV+的生态化反梦,撞上一个“日渐昂贵”的流媒体市场
- java如何添加同名的xml节点_java – 解组具有多个同名元素的XML JAXB
- 学术论文等级划分(包括EI会议论文)
- 谷歌浏览器驱动器下载网址
- 我用Python合成大西瓜!
热门文章
- java连接mongodb的jar包_Java实战之管家婆记账系统(1)——项目简述
- JWT 实现微服务鉴权
- sit matlab,LabView SIT工具包的使用和安装说明
- 图片高亮处理编程_GMT语法高亮-智能提示-代码补全插件
- thinkphp json_原创干货 | Thinkphp序列化合总
- 计算机net use命令使用,网络命令net之net use应用
- java中插入排序实例_java中对插入排序的理解以及实例
- vant按需引入没样式_vue vant-ui样式出不来的问题
- mysql建表时外检怎么创建_MySQL创建表时加入的约束以及外键约束的的意义
- 工业交换机与工业路由器的区别