.NET Core API统一错误处理中间件实现指南
1. 项目概述在.NET Core API开发中错误处理是一个关键环节。统一的错误拦截机制能够帮助我们标准化错误响应格式集中处理异常逻辑提供一致的客户端体验简化调试和问题排查2. 核心需求解析2.1 为什么需要统一错误处理当API接口出现异常时我们需要确保客户端收到结构化的错误信息敏感信息不会泄露错误日志被完整记录HTTP状态码准确反映问题性质2.2 常见错误场景典型的API错误包括业务逻辑异常数据验证失败资源未找到权限不足系统内部错误3. 技术实现方案3.1 中间件实现创建全局异常处理中间件public class ExceptionHandlingMiddleware { private readonly RequestDelegate _next; private readonly ILoggerExceptionHandlingMiddleware _logger; public ExceptionHandlingMiddleware( RequestDelegate next, ILoggerExceptionHandlingMiddleware logger) { _next next; _logger logger; } public async Task InvokeAsync(HttpContext context) { try { await _next(context); } catch (Exception ex) { await HandleExceptionAsync(context, ex); } } private async Task HandleExceptionAsync(HttpContext context, Exception exception) { _logger.LogError(exception, An unexpected error occurred); var response new ErrorResponse { StatusCode GetStatusCode(exception), Message GetMessage(exception), Details context.Request.Path }; context.Response.ContentType application/json; context.Response.StatusCode response.StatusCode; await context.Response.WriteAsync(JsonSerializer.Serialize(response)); } private static int GetStatusCode(Exception exception) exception switch { ValidationException StatusCodes.Status400BadRequest, NotFoundException StatusCodes.Status404NotFound, UnauthorizedAccessException StatusCodes.Status401Unauthorized, _ StatusCodes.Status500InternalServerError }; }3.2 注册中间件在Startup.cs中配置public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { app.UseMiddlewareExceptionHandlingMiddleware(); // 其他中间件... }4. 进阶实现技巧4.1 使用ProblemDetails规范遵循RFC 7807标准services.AddProblemDetails(options { options.CustomizeProblemDetails ctx { ctx.ProblemDetails.Extensions.Add(requestId, ctx.HttpContext.TraceIdentifier); }; });4.2 验证错误处理处理ModelState验证错误services.ConfigureApiBehaviorOptions(options { options.InvalidModelStateResponseFactory context { var problemDetails new ValidationProblemDetails(context.ModelState) { Type https://tools.ietf.org/html/rfc7231#section-6.5.1, Title Validation Error, Status StatusCodes.Status400BadRequest, Instance context.HttpContext.Request.Path }; return new BadRequestObjectResult(problemDetails); }; });5. 生产环境最佳实践5.1 安全考虑确保生产环境中不暴露堆栈跟踪不泄露敏感信息使用标准错误格式记录完整错误日志5.2 性能优化错误处理中的性能要点避免在热路径中进行复杂处理使用缓存常见错误响应异步日志记录限制错误详情大小6. 测试与验证6.1 单元测试示例测试中间件行为[Fact] public async Task ShouldReturnProperErrorResponse() { // Arrange var middleware new ExceptionHandlingMiddleware( innerHttpContext throw new ValidationException(Invalid input), Mock.OfILoggerExceptionHandlingMiddleware()); var context new DefaultHttpContext(); context.Response.Body new MemoryStream(); // Act await middleware.InvokeAsync(context); // Assert context.Response.Body.Seek(0, SeekOrigin.Begin); var reader new StreamReader(context.Response.Body); var response await reader.ReadToEndAsync(); Assert.Equal(StatusCodes.Status400BadRequest, context.Response.StatusCode); Assert.Contains(Invalid input, response); }6.2 集成测试测试完整请求流程[Fact] public async Task ApiEndpoint_ReturnsFormattedError() { // Arrange var factory new WebApplicationFactoryStartup(); var client factory.CreateClient(); // Act var response await client.GetAsync(/api/test/throw); // Assert Assert.Equal(HttpStatusCode.InternalServerError, response.StatusCode); var content await response.Content.ReadAsStringAsync(); var error JsonSerializer.DeserializeErrorResponse(content); Assert.NotNull(error); Assert.Equal(500, error.StatusCode); }7. 常见问题解决7.1 错误信息不统一解决方案创建基础异常类使用异常过滤器实现自定义ProblemDetailsFactory7.2 日志记录不完整推荐做法记录请求上下文包含用户信息保存相关ID如CorrelationId结构化日志格式8. 性能考量错误处理对性能的影响主要来自异常创建和捕获开销日志记录I/O响应序列化中间件管道处理优化建议避免过度使用异常处理业务逻辑异步记录日志缓存常见错误响应限制错误详情数据量9. 扩展方案9.1 分布式追踪集成结合OpenTelemetryservices.AddOpenTelemetry() .WithTracing(builder builder .AddAspNetCoreInstrumentation() .AddConsoleExporter());9.2 客户端错误处理提供客户端SDK处理建议// 前端错误处理示例 async function callApi() { try { const response await fetch(/api/data); if (!response.ok) { const error await response.json(); handleApiError(error); return; } // 处理正常响应 } catch (error) { handleNetworkError(error); } } function handleApiError(error) { if (error.statusCode 401) { // 跳转登录 } else if (error.statusCode 429) { // 重试逻辑 } else { // 显示通用错误 } }10. 部署注意事项生产环境部署时需要禁用开发人员异常页配置适当的日志级别设置全局错误路由监控错误率指标配置告警阈值典型生产配置public void Configure(IApplicationBuilder app, IWebHostEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } else { app.UseExceptionHandler(/error); app.UseHsts(); } app.UseMiddlewareExceptionHandlingMiddleware(); }

相关新闻

ESP32-S3音频开发实战:WAV音乐播放器实现

ESP32-S3音频开发实战:WAV音乐播放器实现

1. ESP32-S3音乐播放器实验概述在嵌入式音频开发领域,ESP32-S3凭借其强大的处理能力和丰富的外设接口,成为实现高质量音频应用的理想选择。本实验基于正点原子DNESP32S3开发板,利用其板载的ES8388音频编解码器和I2S接口,构建了一个…

2026/8/4 12:59:36 阅读更多 →
大语言模型路由系统:从基础原理到生产级实践

大语言模型路由系统:从基础原理到生产级实践

模型路由看似简单,直到你真正开始使用它。如果你正在构建基于大语言模型的应用,可能已经遇到过这样的场景:用户输入一个问题,你需要决定是调用 GPT-4 来处理复杂推理,还是用 Claude 来生成创意内容,或者用本…

2026/8/4 17:13:35 阅读更多 →
AM62L CBASS防火墙配置实战:从寄存器解析到安全区域设计

AM62L CBASS防火墙配置实战:从寄存器解析到安全区域设计

1. 从寄存器手册到实战:理解AM62L CBASS防火墙的权限与地址配置如果你正在基于德州仪器(TI)的AM62L Sitara™处理器开发嵌入式系统,尤其是涉及安全启动、多域隔离或外设保护的应用,那么你迟早要和CBASS防火墙打交道。这…

2026/8/4 17:02:14 阅读更多 →

最新新闻

用Python玩转数据采集:NI-DAQmx库深度揭秘

用Python玩转数据采集:NI-DAQmx库深度揭秘

用Python玩转数据采集:NI-DAQmx库深度揭秘 【免费下载链接】nidaqmx-python NI-DAQmx API for Python, created and supported by NI 项目地址: https://gitcode.com/gh_mirrors/ni/nidaqmx-python 还在为数据采集设备编程烦恼吗?想用Python轻松搞…

2026/8/4 23:30:32 阅读更多 →
我把采集流程重构了一遍,现在几秒就能拿到结构化数据

我把采集流程重构了一遍,现在几秒就能拿到结构化数据

文章目录前言重构采集流程完整工程代码更多采集场景SERP API网页采集 API通用采集 API数据集市场Dashboard 控制台总结前言 大家好,我是颜颜yan_。 最近在做视频数据采集项目时,遇到了各种实际问题。页面大量使用动态加载,数据并不在初始 H…

2026/8/4 23:30:32 阅读更多 →
从论文到代码:ProGen2论文核心观点与开源实现的完美结合

从论文到代码:ProGen2论文核心观点与开源实现的完美结合

从论文到代码:ProGen2论文核心观点与开源实现的完美结合 【免费下载链接】progen Official release of the ProGen models 项目地址: https://gitcode.com/gh_mirrors/pr/progen ProGen2是蛋白质工程领域的突破性语言模型,由官方发布的开源项目提…

2026/8/4 23:30:32 阅读更多 →
Grafana_Zabbix_ImageRenderer_部署与前端操作手册

Grafana_Zabbix_ImageRenderer_部署与前端操作手册

Grafana Zabbix Plugin Image Renderer 离线部署与前端操作手册适用环境:Kylin V10 SP3 部署方式:离线 RPM 离线插件安装 文档版本:v1.0一、环境信息项目版本/说明操作系统Kylin V10 SP3Grafana10.4.19(Enterprise)…

2026/8/4 23:30:32 阅读更多 →
三. 和利时 MODBUSTCP 主站/从站协议

三. 和利时 MODBUSTCP 主站/从站协议

一. 什么是 MODBUSTCP MODBUS TCP 使用服务器与客户机的通信方式,由客户机对服务器的数据进行操作访问(读/写),服务器响应客户机的读写操作 ‌ Modbus TCP确实使用网线进行通信‌。Modbus TCP是基于TCP/IP协议的应用层协议…

2026/8/4 23:30:32 阅读更多 →
第10课:文件与数据存储

第10课:文件与数据存储

10_file_handling.py 一、课程目标 序号 学习目标 ① 掌握文本文件的读写操作 ② 理解文件打开模式和with语句 ③ 掌握JSON数据的序列化与反序列化 ④ 掌握CSV文件的读写操作 ⑤ 学会使用os模块管理文件和目录 ⑥ 掌握文件异常处理方法 二、知识讲解 2.1 文件操作概述 文件操…

2026/8/4 23:29:31 阅读更多 →

日新闻

AI Agent白手起家26: 使用标准事件驱动大模型实践

AI Agent白手起家26: 使用标准事件驱动大模型实践

纲要 练习目标:掌握大模型标准事件的调用回顾 LangChain 中的核心标准事件 invokestreambatchastream_eventswith_structured_output 环境准备实战代码:多种事件调用对比 同步调用与流式输出批量处理异步事件流监听结构化输出 运行说明与预期结果总结与扩…

2026/8/4 0:00:40 阅读更多 →
dealsea是什么?跨境卖家必知的美国deal站入门指南

dealsea是什么?跨境卖家必知的美国deal站入门指南

说实话,第一次听说美国这个老牌折扣网站的跨境卖家,十个有八个会问同一个问题:这个平台到底是干嘛的?我见过一个做家居出口的朋友,他在亚马逊上月销二十万美金,却从来没用过它。我给他看了首页——一屏一屏…

2026/8/4 0:01:40 阅读更多 →
清华大学重磅EST:植物自导电闪蒸焦耳热600°C/2600°C两步法!稀土超积累植物秒级转化为CeO₂-石墨烯电催化剂!

清华大学重磅EST:植物自导电闪蒸焦耳热600°C/2600°C两步法!稀土超积累植物秒级转化为CeO₂-石墨烯电催化剂!

通讯作者:邓兵、刘建国通讯单位:清华大学DOI:https://doi.org/10.1021/acs.est.6c00603研究背景稀土元素(REEs)是清洁能源技术与电子器件不可或缺的核心原料,然而传统提取方式依赖能耗高、排放大的采矿与强…

2026/8/4 0:01:40 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/4 13:24:41 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/4 11:41:39 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/4 5:26:40 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/4 13:38:24 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/4 11:09:16 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/4 13:38:40 阅读更多 →