如何为ASP.NET Core Web API设置未匹配端点的默认请求处理器?
如何在ASP.NET Core Web API中记录未匹配端点的404请求
完全可行,下面提供两种常用的实现方式:
方法一:使用自定义中间件(推荐)
在请求管道的末尾添加中间件,捕获所有未被前面中间件/端点处理的请求,记录日志后返回404。
在Program.cs中添加以下代码(需放在所有端点映射代码之后):
app.Use(async (context, next) => { await next(); // 检查是否返回404且无匹配端点 if (context.Response.StatusCode == StatusCodes.Status404NotFound && context.GetEndpoint() == null) { var logger = context.RequestServices.GetRequiredService<ILogger<Program>>(); logger.LogWarning("未匹配到API端点,请求路径:{Path},请求方法:{Method}", context.Request.Path, context.Request.Method); } }); // 确保中间件在端点映射之后执行 app.MapControllers();
关键提示:中间件顺序必须在MapControllers、MapGet等端点配置之后,才能保证只有未被处理的请求进入该逻辑。
方法二:配置自定义状态码页面
利用ASP.NET Core的状态码页面功能,针对404状态码添加日志逻辑。
在Program.cs中配置:
app.UseStatusCodePages(async context => { var response = context.HttpContext.Response; if (response.StatusCode == StatusCodes.Status404NotFound) { var logger = context.HttpContext.RequestServices.GetRequiredService<ILogger<Program>>(); logger.LogWarning("请求未找到匹配端点,路径:{Path},方法:{Method}", context.HttpContext.Request.Path, context.HttpContext.Request.Method); // 保持默认404响应内容,若需JSON格式可修改此处 context.HttpContext.Response.ContentType = "application/json"; await context.HttpContext.Response.WriteAsync("{\"message\":\"未找到请求的资源\"}"); } }); app.MapControllers();
注意事项
- 确保项目已默认配置
ILogger服务(ASP.NET Core模板自带)。 - 日志级别建议使用
Warning,避免大量404日志干扰正常业务日志。 - 若API使用路由前缀,日志中会自动记录完整请求路径无需额外处理。
内容的提问来源于stack exchange,提问作者Yyh
相关产品推荐
相关产品推荐

