Configure、中间件与ErrorHandlingMiddleware全局异常捕获

一、Configure

  Startup.cs中的Configure方法主要是http处理管道配置、中间件和一些系统配置,其中

  IApplicationBuilder: 定义一个类,该类提供配置应用程序请求的机制管道。通过IApplicationBuilder下的run、use方法传入管道处理方法。这是最常用方法,对于一个真实环境的应用基本上都需要比如权限验证、跨域、异常处理等。

  IHostingEnvironment:提供有关正在运行的应用程序的web托管环境的信息

简单来说Configure方法就是来加载一些中间件以及处理一些管道配置和系统配置的,下面看下什么是中间件。

二、Middleware

Middleware  中间件是一个处理http请求和响应的组件,多个中间件构成了处理管道(Handler pipeline),每个中间件可以决定是否传递至管道中的下一中间件。

注册--一旦注册中间件后,每次请求和响应均会被调用。中间件的注册在startup中的Configure方法完成,在configure方法中使用IApplicationBuilder对象的Run、Map、Use方法传入匿名委托(delegate)。

具体例子我们一起看下ErrorHandlingMiddleware,如何注册中间件的以及使用的。

三、ErrorHandlingMiddleware

3.1、为什么使用ErrorHandlingMiddleware全局异常捕获

有些时候项目总会出现一些始料未及的错误,项目启动瞬间崩塌。一脸懵,都不知道咋回事。刚启动就完事儿了。还有的情况测试接口的时候,打了断点,然后运行项目。偏偏死活不进断点。结果返回一个200ok,

  甚是恼火。这时候ErrorHandlingMiddleware就起作用了,不管应该运行如何,至少会进入ErrorHandlingMiddleware方法,一旦报错也会出现错误信息,这样我们也就能好快的解决问题。而且ErrorHandlingMiddleware简单,方便快捷。

3.2、构建ErrorHandlingMiddleware方法

 public class ErrorHandlingMiddleware
    {
        private readonly RequestDelegate next;
        public ErrorHandlingMiddleware(RequestDelegate next)
        {
            this.next = next;
        }
        public async Task Invoke(HttpContext context /* other dependencies */)
        {
            try
            {
                await next(context);
            }
            catch (Exception ex)
            {
                await HandleExceptionAsync(context, ex);
            }

        }
        private static Task HandleExceptionAsync(HttpContext context, Exception ex)
        {
            var code = HttpStatusCode.InternalServerError; // 500 if unexpected
            var Info = "";
            switch (context.Response.StatusCode)
            {
                case 401:
                    Info = "没有权限";
                    break;
                case 404:
                    Info = "未找到服务";
                    break;
                case 403:
                    Info = "服务器理解请求客户端的请求,但是拒绝执行此请求";
                    break;
                case 500:
                    Info = "服务器内部错误,无法完成请求";
                    break;
                case 502:
                    Info = "请求错误";
                    break;
                default:
                    Info = "内部错误";
                    break;
            }
            LogHelp.Error(ex);
            var result = JsonConvert.SerializeObject(new { error = ex.Message });
            context.Response.ContentType = "application/json";
            context.Response.StatusCode = (int)code;
            return context.Response.WriteAsync(result);
        }
    }

不管如何,项目运行了都会进入Invoke方法,一旦出现错误的话就会进入HandleExceptionAsync方法,记录错误然后返回错误信息

3.3、注册中间件使用

  在Startup.cs中的Configure方法中加上中间件的注册。

app.UseMiddleware(typeof(ErrorHandlingMiddleware));

  然后就可以尝试下了,在Invoke方法打上断点,然后运行项目,会发现,项目会先运行到Invoke方法。

原文地址:https://www.cnblogs.com/hulizhong/p/10797636.html

时间: 2024-11-09 17:31:02

Configure、中间件与ErrorHandlingMiddleware全局异常捕获的相关文章

Spring-MVC开发之全局异常捕获全面解读(转)

异常,异常.我们一定要捕获一切该死的异常,宁可错杀一千也不能放过一个!产品上线后的异常更要命,一定要屏蔽错误内容,以免暴露敏感信息!在用Spring MVC开发WEB应用时捕获全局异常的方法基本有两种: WEB.XML,就是指定error-code和page到指定地址,这也是最传统和常见的做法 用Spring的全局异常捕获功能,这种相对可操作性更强一些,可根据自己的需要做一后善后处理,比如日志记录等. SO,本文列出Spring-MVC做WEB开发时常用全局异常捕获的几种解决方案抛砖引玉,互相没

自定义全局异常捕获

原文:http://blog.csdn.net/jinzhencs/article/details/51700009 第一种:实现HandlerExceptionResolver 注意: 把错误码 重设成200,不然还是返回的异常信息. 注解@Compoment交由spring创建bean 之后就能愉快的返回自己的错误码了. 或者记录错误日志. /** * 全局异常捕获 * @author Mingchenchen * */ @Component public class GlobleExcep

Spring-MVC开发之全局异常捕获全面解读

在用Spring MVC开发WEB应用时捕获全局异常的方法基本有两种, WEB.XML,就是指定error-code和page到指定地址,这也是最传统和常见的做法 用Spring的全局异常捕获功能,这种相对可操作性更强一些,可根据自己的需要做一后善后处理,比如日志记录等. SO,本文列出Spring-MVC做WEB开发时常用全局异常捕获的几种解决方案抛砖引玉 互相没有依赖,每个都可单独使用! 定义服务器错误WEB.XML整合Spring MVC web.xml <error-page> <

MVC 好记星不如烂笔头之 ---&gt; 全局异常捕获以及ACTION捕获

public class BaseController : Controller { /// <summary> /// Called after the action method is invoked. /// </summary> /// <param name="filterContext">Information about the current request and action.</param> protected ov

C#中的那些全局异常捕获

1.WPF全局捕获异常 public partial class App : Application { public App() { // 在异常由应用程序引发但未进行处理时发生.主要指的是UI线程. this.DispatcherUnhandledException += new System.Windows.Threading.DispatcherUnhandledExceptionEventHandler(App_DispatcherUnhandledException); //  当某

springboot编程之全局异常捕获

springboot编程之全局异常捕获 1.创建GlobalExceptionHandler.java,在类上注解@ControllerAdvice, 在方法上注解@ExceptionHandler(value = Exception.class),Exception.class表示拦截所有的异常信息 package com.imooc.web.controller; import com.imooc.exception.UserNotExistException; import org.spr

spring boot2.0+中添加全局异常捕获

1.添加自定义异常,继承RuntimeException,为什么继承RuntimeException呢?是因为我们的事务在RuntimeException异常下会发生回滚. 1 public class BusinessException extends RuntimeException{ 2 3 public BusinessException(String code, String msg){ 4 this.code = code; 5 this.msg = msg; 6 } 7 8 pri

ASP.NET Core Web API中实现全局异常捕获与处理

处理全局异常 HANDLING ERRORS GLOBALLY 在上面的示例中,我们的 action 内部有一个 try-catch 代码块.这一点很重要,我们需要在我们的 action 方法体中处理所有的异常(包括未处理的).一些开发者在 action 中使用 try-catch 代码块,这种方式明显没有任何问题.但我们希望 action 尽量保持简洁.因此,从我们的 action 中删除 try-catch ,并将其放在一个集中的地方会是一种更好的方式..NET Core 给我们提供了一种处

170621、springboot编程之全局异常捕获

1.创建GlobalExceptionHandler.java,在类上注解@ControllerAdvice,在方法上注解@ExceptionHandler(value = Exception.class),Exception.class表示拦截所有的异常信息 package com.rick.common.handler; import com.alibaba.fastjson.JSON;import com.alibaba.fastjson.util.IOUtils;import com.r