【问题标题】:ASP.NET COR 2 handler to handle HTTP 4xx errors for WEB API request用于处理 WEB API 请求的 HTTP 4xx 错误的 ASP.NET COR 2 处理程序
【发布时间】:2018-11-21 04:07:57
【问题描述】:

与处理 HTTP 5xx 错误的 UseExceptionHandler 类似,ASP.NET CORE 2 是否提供任何处理程序来处理 HTTP 4xx 错误。

在这里,我试图捕捉在请求处理管道期间产生的任何 HTTP 4xx 错误,并将其发送回消费者。

【问题讨论】:

    标签: c# asp.net-core-2.1


    【解决方案1】:

    您可以创建一个新的中间件来处理您的异常:

    public class ErrorHandlingMiddleware
    {
        private readonly RequestDelegate _next;
    
        /// <summary>
        /// Default constructor
        /// </summary>
        /// <param name="next">Next request in the pipeline</param>
        public ErrorHandlingMiddleware(RequestDelegate next)
        {
            _next = next;
        }
    
        /// <summary>
        /// Entry point into middleware logic
        /// </summary>
        /// <param name="context">Current http context</param>
        /// <returns></returns>
        public async Task Invoke(HttpContext context)
        {
            try
            {
                await _next(context);
            }
            catch (HttpException httpException)
            {
                context.Response.StatusCode = httpException.StatusCode;
            }
            catch (Exception ex)
            {
                await HandleExceptionAsync(context, ex);
            }
        }
    
        private static Task HandleExceptionAsync(HttpContext context, Exception exception)
        {
            var code = HttpStatusCode.InternalServerError; // 500 if unexpected
    
            var result = JsonConvert.SerializeObject(new { Error = "Internal Server error" });
            context.Response.ContentType = "application/json";
            context.Response.StatusCode = (int)code;
            return context.Response.WriteAsync(result);
        }
    }
    

    在您的Startup.cs 中像这样使用它

     public void Configure(IApplicationBuilder app, IHostingEnvironment env)
        {
            if (env.IsDevelopment())
            {
                app.UseDeveloperExceptionPage();
            }
            app.UseMiddleware(typeof(ErrorHandlingMiddleware));
    
            app.UseMvc();
        }
    

    【讨论】:

    • 感谢您的快速回复。我已经在使用 UseExceptionHandler 来捕获 HTTP 5xx 错误。我尝试调试并查看它是否处理 4xx 错误,但发现它没有捕获这些错误。
    • By default, an app doesn't provide a rich status code page for HTTP status codes, such as 404 Not Found. To provide status code pages, use Status Code Pages Middleware. 据此:docs.microsoft.com/en-us/aspnet/core/fundamentals/… 我认为您应该使用 StatusCodePages。但是在 WEB API 中你不应该返回 HTML。您应该返回某种类型的可序列化数据,这是我的中间件通过返回 JSON 所做的。看看他们的例子,他们返回纯文本结果。
    • 我尝试了您提到的代码,但我发现任何 HTTP 4xx 错误都没有被 ErrorHandlingMiddleware 捕获
    • 是的,那是因为 4xx 也不例外。如果您的控制器操作返回 4xx,这意味着控制器操作正在处理结果值。这仅适用于您未在代码中处理的异常。
    • 非常感谢您提供详细信息
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-23
    相关资源
    最近更新 更多