You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

ASP.NET Core中Swashbuckle触发NotSupportedException异常求助

解决ASP.NET Core 2.2集成Swashbuckle时的路由冲突错误

这个问题我之前也碰到过,本质是Swagger 2.0规范要求每个HTTP方法+路径的组合必须唯一,而你的UsersController.GetByIdValuesController.Get刚好触发了这个冲突规则。下面一步步帮你排查解决:

最常见的冲突原因:控制器路由前缀配置重复

如果你的两个控制器都用了类似下面的路由写法,就会导致生成的完整路径完全一致:

// UsersController
[Route("api")]
[ApiController]
public class UsersController : ControllerBase
{
    [HttpGet("{id}")]
    public IActionResult GetById(int id) { /* 逻辑代码 */ }
}

// ValuesController
[Route("api")]
[ApiController]
public class ValuesController : ControllerBase
{
    [HttpGet("{id}")]
    public IActionResult Get(int id) { /* 逻辑代码 */ }
}

此时两个Action的完整路径都是api/{id},且都用GET方法,Swagger无法区分,就会抛出你看到的错误。


解决方案一:修正控制器路由前缀(推荐)

给控制器路由加上[controller]占位符,让每个控制器的前缀自动包含名称,这样路径会自然区分:

// UsersController
[Route("api/[controller]")] // 自动生成前缀:api/users
[ApiController]
public class UsersController : ControllerBase
{
    [HttpGet("{id}")] // 完整路径:api/users/{id}
    public IActionResult GetById(int id) { /* 逻辑代码 */ }
}

// ValuesController
[Route("api/[controller]")] // 自动生成前缀:api/values
[ApiController]
public class ValuesController : ControllerBase
{
    [HttpGet("{id}")] // 完整路径:api/values/{id}
    public IActionResult Get(int id) { /* 逻辑代码 */ }
}

修改后两个Action的路径完全独立,Swagger就能正常识别了。

解决方案二:用路由约束区分(参数类型不同时适用)

如果两个Action的id参数类型不一样(比如一个是int,一个是Guid),可以给路由加上类型约束来区分:

// UsersController
[HttpGet("{id:int}")]
public IActionResult GetById(int id) { /* 逻辑代码 */ }

// ValuesController
[HttpGet("{id:guid}")]
public IActionResult Get(Guid id) { /* 逻辑代码 */ }

这样即使前缀相同,Swagger也会认为是不同的路径组合。

解决方案三:临时使用ConflictingActionsResolver(不推荐长期使用)

如果暂时不想调整路由结构,可以在Swagger配置里添加冲突解析器,让Swagger默认取第一个匹配的Action:

// Startup.cs -> ConfigureServices方法
services.AddSwaggerGen(c =>
{
    c.SwaggerDoc("v1", new OpenApiInfo { Title = "你的API名称", Version = "v1" });
    
    // 临时解决冲突:取第一个匹配的API描述
    c.ResolveConflictingActions(apiDescriptions => apiDescriptions.First());
});

注意:这个方法只是绕过了错误,并没有真正解决路由冲突的潜在问题,长期维护还是建议调整路由结构。

内容的提问来源于stack exchange,提问作者pantonis

火山引擎 最新活动