1、一般Asp.Net Core 创建项目后 StartUp文件中存在 StartUp、ConfigureServices 、Configure 函数或方法
2、中间件一般在Configure中配置或启用
不多说了,直接操作
一、创建项目(.NetCore 3.1)
  建议创建API项目便于后续测试验证,因为本人只是Demo创建一个空API显得更为整洁

 
创建完成后StartUp类
  1. public class Startup
  2. {
  3. // This method gets called by the runtime. Use this method to add services to the container.
  4. // For more information on how to configure your application, visit https://go.microsoft.com/fwlink/?LinkID=398940
  5. public void ConfigureServices(IServiceCollection services)
  6. {
  7. }
  8. // This method gets called by the runtime. Use this method to configure the HTTP request pipeline.
  9. public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
  10. {
  11. if (env.IsDevelopment())
  12. {
  13. app.UseDeveloperExceptionPage();
  14. }
  15. app.UseRouting();
  16. app.UseEndpoints(endpoints =>
  17. {
  18. endpoints.MapGet("/", async context =>
  19. {
  20. await context.Response.WriteAsync("Hello World!");
  21. });
  22. });
  23. }
  24. }
 2、创建扩展类、中间件、结果类
    
   Extension

  1. public static class ApplicationBuilderExtensions
  2. {
  3. public static IApplicationBuilder UseExceptionHandle(this IApplicationBuilder app)
  4. {
  5. app.UseMiddleware<ExceptionHandleMiddleware>();//UseMiddleware添加中间件
  6. return app;
  7. }
  8. }
 
 Middleware
  1. public class ExceptionHandleMiddleware
  2. {
  3. private readonly RequestDelegate _next;
  4. private readonly ILogger _logger;
  5. public ExceptionHandleMiddleware( RequestDelegate next, ILogger<ExceptionHandleMiddleware> logger)
  6. {
  7. _next = next;
  8. _logger = logger;
  9. }
  10. public async Task InvokeAsync(HttpContext httpContext)
  11. {
  12. try
  13. {
  14. await _next(httpContext);
  15. }
  16. catch (Exception ex)
  17. {
  18. await HandleExceptionAsync(httpContext, ex);
  19. }
  20. }
  21. private Task HandleExceptionAsync(HttpContext context, Exception exception)
  22. {
  23. context.Response.ContentType = "application/json";
  24. context.Response.StatusCode = (int)HttpStatusCode.InternalServerError;
  25. var error = exception.ToString();
  26. _logger.LogError(error);
  27. return context.Response.WriteAsync(JsonConvert.SerializeObject(ResultModel.Failed(error), new JsonSerializerSettings
  28. {
  29. ContractResolver = new CamelCasePropertyNamesContractResolver()
  30. }));
  31. }
  32. }
IResult
  1. /// <summary>
  2. /// 返回结果模型接口
  3. /// </summary>
  4. public interface IResultModel
  5. {
  6. /// <summary>
  7. /// 是否成功
  8. /// </summary>
  9. [JsonIgnore]
  10. bool Successful { get; }
  11. /// <summary>
  12. /// 错误
  13. /// </summary>
  14. string Msg { get; }
  15. }
  16. /// <summary>
  17. /// 返回结果模型泛型接口
  18. /// </summary>
  19. /// <typeparam name="T"></typeparam>
  20. public interface IResultModel<T> : IResultModel
  21. {
  22. /// <summary>
  23. /// 返回数据
  24. /// </summary>
  25. T Data { get; }
  26. }
Result
  1. /// <summary>
  2. /// 返回结果
  3. /// </summary>
  4. public class ResultModel<T> : IResultModel<T>
  5. {
  6. /// <summary>
  7. /// 处理是否成功
  8. /// </summary>
  9. [JsonIgnore]
  10. public bool Successful { get; private set; }
  11. /// <summary>
  12. /// 错误信息
  13. /// </summary>
  14. public string Msg { get; private set; }
  15. /// <summary>
  16. /// 状态码
  17. /// </summary>
  18. public int Code => Successful ? : ;
  19. /// <summary>
  20. /// 返回数据
  21. /// </summary>
  22. public T Data { get; private set; }
  23. /// <summary>
  24. /// 成功
  25. /// </summary>
  26. /// <param name="data">数据</param>
  27. /// <param name="msg">说明</param>
  28. public ResultModel<T> Success(T data = default, string msg = "success")
  29. {
  30. Successful = true;
  31. Data = data;
  32. Msg = msg;
  33. return this;
  34. }
  35. /// <summary>
  36. /// 失败
  37. /// </summary>
  38. /// <param name="msg">说明</param>
  39. public ResultModel<T> Failed(string msg = "failed")
  40. {
  41. Successful = false;
  42. Msg = msg;
  43. return this;
  44. }
  45. }
  46. /// <summary>
  47. /// 返回结果
  48. /// </summary>
  49. public static class ResultModel
  50. {
  51. /// <summary>
  52. /// 成功
  53. /// </summary>
  54. /// <param name="data">返回数据</param>
  55. /// <returns></returns>
  56. public static IResultModel Success<T>(T data = default(T))
  57. {
  58. return new ResultModel<T>().Success(data);
  59. }
  60. /// <summary>
  61. /// 成功
  62. /// </summary>
  63. /// <returns></returns>
  64. public static IResultModel Success()
  65. {
  66. return Success<string>();
  67. }
  68. /// <summary>
  69. /// 失败
  70. /// </summary>
  71. /// <param name="error">错误信息</param>
  72. /// <returns></returns>
  73. public static IResultModel Failed<T>(string error = null)
  74. {
  75. return new ResultModel<T>().Failed(error ?? "failed");
  76. }
  77. /// <summary>
  78. /// 失败
  79. /// </summary>
  80. /// <returns></returns>
  81. public static IResultModel Failed(string error = null)
  82. {
  83. return Failed<string>(error);
  84. }
  85. /// <summary>
  86. /// 根据布尔值返回结果
  87. /// </summary>
  88. /// <param name="success"></param>
  89. /// <returns></returns>
  90. public static IResultModel Result<T>(bool success)
  91. {
  92. return success ? Success<T>() : Failed<T>();
  93. }
  94. /// <summary>
  95. ///
  96. /// </summary>
  97. /// <param name="success"></param>
  98. /// <returns></returns>
  99. public static IResultModel Result(bool success)
  100. {
  101. return success ? Success() : Failed();
  102. }
  103. /// <summary>
  104. /// 数据已存在
  105. /// </summary>
  106. /// <returns></returns>
  107. public static IResultModel HasExists => Failed("数据已存在");
  108. /// <summary>
  109. /// 数据不存在
  110. /// </summary>
  111. public static IResultModel NotExists => Failed("数据不存在");
  112. }
 
到此中间件已经添加完成

ASP.NET CORE之中间件-自定义异常中间件的更多相关文章

  1. 在ASP.NET Core 中使用Cookie中间件

    在ASP.NET Core 中使用Cookie中间件 ASP.NET Core 提供了Cookie中间件来序列化用户主题到一个加密的Cookie中并且在后来的请求中校验这个Cookie,再现用户并且分 ...

  2. asp.net core mvc 管道之中间件

    asp.net core mvc 管道之中间件 http请求处理管道通过注册中间件来实现各种功能,松耦合并且很灵活 此文简单介绍asp.net core mvc中间件的注册以及运行过程 通过理解中间件 ...

  3. 在ASP.NET Core 中使用Cookie中间件 (.net core 1.x适用)

    在ASP.NET Core 中使用Cookie中间件 ASP.NET Core 提供了Cookie中间件来序列化用户主题到一个加密的Cookie中并且在后来的请求中校验这个Cookie,再现用户并且分 ...

  4. Asp.Net Core入门之自定义中间件

    什么是中间件? 这里引用官方解释: 中间件是用于组成应用程序管道来处理请求和响应的组件.管道内的每一个组件都可以选择是否将请求交给下一个组件.并在管道中调用下一个组件之前和之后执行某些操作.请求委托被 ...

  5. asp.net core 3.1 自定义中间件实现jwt token认证

    asp.net core 3.1 自定义中间件实现jwt token认证 话不多讲,也不知道咋讲!直接上代码 认证信息承载对象[user] /// <summary> /// 认证用户信息 ...

  6. ASP.NET Core 使用 URL Rewrite 中间件实现 HTTP 重定向到 HTTPS

    在传统 ASP.NET 程序中,我们可以通过配置 IIS 的“URL 重写”功能实现将 HTTP 请求重定向为 HTTPS .但是该方法在 ASP.NET Core 应用中不再工作.在 ASP.NET ...

  7. asp.net core中写入自定义中间件

    首先要明确什么是中间件?微软官方解释:https://docs.microsoft.com/zh-cn/aspnet/core/fundamentals/middleware/?tabs=aspnet ...

  8. ASP.NET Core 2.2在中间件内使用有作用域的服务

    服务生存期 为每个注册的服务选择适当的生存期.可以使用以下生存期配置ASP.NET Core服务: 暂时 暂时生存期服务 (AddTransient) 是每次从服务容器进行请求时创建的. 这种生存期适 ...

  9. ASP.NET CORE 管道模型及中间件使用解读

    说到ASP.NET CORE 管道模型不得不先来看看之前的ASP.NET 的管道模型,两者差异很大,.NET CORE 3.1 后完全重新设计了框架的底层,.net core 3.1 的管道模型更加灵 ...

随机推荐

  1. cb18a_c++_修改string对象的方法

    cb18a_c++_修改string对象的方法s.insert(p,t)s.insert(p, 'A'); //迭代器前插入As.insert<p,n,t)s.insert(p, 3, 'B') ...

  2. 一文带你了解Redis持久化完整版本

    本文讲解知识点 持久化的简介 RDB AOF RDB与AOF的区别 持久化应用场景 对于持久化这个功能点,其实很简单没有那么复杂 演示环境 centos7.0 redis4.0 redis存放目录:/ ...

  3. 循序渐进VUE+Element 前端应用开发(12)--- 整合ABP框架的前端登录处理

    VUE+Element 前端是一个纯粹的前端处理,前面介绍了很多都是Vue+Element开发的基础,从本章随笔开始,就需要进入深水区了,需要结合ABP框架使用(如果不知道,请自行补习一下我的随笔:A ...

  4. 吃货联盟订餐系统 源代码 Java初级小项目

    咳咳,今天博主给大家写一个小的项目:吃货联盟订餐系统.博主不是大神(互联网架构师的路上ing),也是小白一个,不过是刚入门的小白^_^.项目功能也很简单:只是模拟日常的订餐流程呦,所以有错误以及功能不 ...

  5. intellij配置github

    一.在IDEA中设置Git,在File-->Setting->Version Control-->Git-->Path to Git executable选择你的git安装后的 ...

  6. BOM问题-对于php的影响

    甲.BOM说明 BOM(Byte Order Mark),是UTF编码方案里用于标识编码的标准标记.这个标记是可选的,UTF-8不需要BOM来表明字节顺序,但可以用BOM来表明当前编码方式.但如果文件 ...

  7. Python之浅谈多态和封装

    目录 组合 什么是组合 为什么使用组合 多态和多态性 多态 什么是多态? 多态性 好处 多态性 什么是多态性 封装 封装是什么意思? 隐藏 如何用代码实现隐藏 python 实际上是可以访问隐藏属性的 ...

  8. CSS选择器整理以及优先级介绍

    一.基础选择器 选择器 名称 描述 兼容性 * 通配选择器 选择所有的元素 ie6+ E 元素选择器 选择指定的元素 ie6+ #idName id选择器 选择id属性等于idName的元素 ie6+ ...

  9. Linux中清空docker容器日志

    新建文件docker-clear-log,放在/usr/local/bin/目录下,文件内容如下: #!/bin/bash -e if [[ -z $ ]]; then echo "No c ...

  10. 一行一行源码分析清楚AbstractQueuedSynchronizer

    ​“365篇原创计划”第二十四篇. 今天呢!灯塔君跟大家讲: 一行一行源码分析清楚AbstractQueuedSynchronizer 在分析 Java 并发包 java.util.concurren ...