.NET 6控制器方法无法触发:返回200但无预期内容及日志
问题分析与可能原因
1. TenantSecurityMiddleware未正确传递请求
你只提供了中间件的扩展类,但未给出TenantSecurityMiddleware的具体实现。如果该中间件内部没有调用await next(context),请求会被直接拦截,无法到达后续的控制器环节。这会导致:
- 控制器构造函数和方法都不会执行,所以日志无输出
- 请求被中间件处理后直接返回200,但没有返回控制器的内容
解决方式:检查TenantSecurityMiddleware的InvokeAsync方法,确保包含请求传递逻辑:
public async Task InvokeAsync(HttpContext context) { // 自定义租户逻辑处理 await _next(context); // 必须调用此行传递请求到后续中间件/控制器 }
2. 中间件顺序严重错误
.NET 6中间件执行顺序直接决定请求流程,你的Program文件存在多处顺序问题:
UseDeveloperExceptionPage应放在请求流程最前端,否则无法捕获前置中间件的异常UseHttpsRedirection应在UseRouting之前执行,确保HTTP请求先重定向到HTTPSMapControllers与UseEndpoints重复配置,导致路由匹配混乱UseTenant位置若在UseRouting之前,可能干扰路由解析逻辑
正确的中间件顺序示例:
var app = builder.Build(); if (app.Environment.IsDevelopment()) { app.UseDeveloperExceptionPage(); // 开发环境异常页前置 app.UseSwagger(); app.UseSwaggerUI(c => { c.SwaggerEndpoint("/swagger/v1/swagger.json", "MTApp API V1"); }); } app.UseHttpsRedirection(); app.UseSession(); app.UseTenant(); app.UseRouting(); app.UseAuthorization(); // 二选一:属性路由控制器推荐用MapControllers,无需重复配置UseEndpoints app.MapControllers(); app.Run();
3. 日志输出级别未配置
.NET 6默认日志配置(appsettings.Development.json)可能未启用Information级别日志,导致你添加的LogInformation日志无法输出。
检查配置文件:确保Logging节点包含以下配置:
{ "Logging": { "LogLevel": { "Default": "Information", "Microsoft.AspNetCore": "Warning" } } }
4. 路由重复映射导致匹配异常
你同时使用UseEndpoints配置MVC默认路由,又单独调用MapControllers,这会导致路由系统冲突,请求可能无法正确匹配到DobedoController的GetHW2方法。
解决方式:删除其中一个路由配置。由于你的控制器使用了[ApiController]和[Route]特性(属性路由),推荐保留MapControllers即可,无需配置默认路由。
内容的提问来源于stack exchange,提问作者ZedZip
相关产品推荐
相关产品推荐

