You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.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请求先重定向到HTTPS
  • MapControllers与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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.10 17:31:10