将 Swashbuckle 添加到 .NET Core Web API 应用程序后,访问版本化路由会返回 404

Posted

技术标签:

【中文标题】将 Swashbuckle 添加到 .NET Core Web API 应用程序后,访问版本化路由会返回 404【英文标题】:Accessing versioned routes returns 404 once Swashbuckle is added to a .NET Core Web API application 【发布时间】:2022-01-23 23:28:42 【问题描述】:

我创建了一个最小可行样本来隔离我遇到的这个问题。我确定这是我缺少的东西,而不是工具本身。我正在寻求帮助,弄清楚我缺少什么以及如何解决它。

我有一个准系统 .NET Core 3.1 Web API。它包含 2 个控制器(版本 1 和版本 2),它们公开相同的端点并具有相同的名称:

/api/v1/foo/status /api/v2/foo/status

如果我不向应用程序添加 Swashbuckle,我可以点击这些端点并通过 Web 浏览器查看预期的响应。 (响应为 HTTP 200,响应正文包含预期的文本。)

但是,一旦我将 Swashbuckle 添加到解决方案中,就会出现 Swagger 页面并且一切看起来都很好,但我无法再通过 Swagger UI 或浏览器本身访问端点。

相反,如果使用[Route('api/version/foo')] 在路由中指定版本,则响应为 HTTP 404,响应正文中包含以下内容:


  "error": 
    "code": "UnsupportedApiVersion",
    "message": "The HTTP resource that matches the request URI 'http://localhost:3011/api/v2/foo/status' is not supported.",
    "innerError": null
  

或者,如果使用[Route('api/v2/foo')] 将版本硬编码到路由中,则响应为 HTTP 400,响应正文中包含以下内容:


  "error": 
    "code": "UnsupportedApiVersion",
    "message": "The HTTP resource that matches the request URI 'https://localhost:44343/api/v2/foo/status' is not supported.",
    "innerError": null
  

我已经尝试了在各种博客文章、*** 问题和 Microsoft 文章中可以找到的所有内容,但均无济于事,包括以下内容:

[ApiController] 添加到每个控制器。 将[ApiVersion] 添加到每个控制器。 在每条路由中明确包含version:apiVersion。 将[MapToApiVersion] 添加到每个控制器操作。 在配置 SwaggerGen 时添加 DocumentFilter 和 OperationFilter。

到目前为止,还没有解决方案。

包含 MVP 项目的解决方案可以在 GitHub 的以下位置找到:https://github.com/DreadLordMikey/NetCoreWebApiMVP

【问题讨论】:

【参考方案1】:

将两个控制器路由改为:

[Route("api/vversion:apiVersion/foo")]

并删除下面的options.SubstitutionFormat

services.AddVersionedApiExplorer(options =>

    options.AssumeDefaultVersionWhenUnspecified = true;
    options.DefaultApiVersion = new Microsoft.AspNetCore.Mvc.ApiVersion(1, 0);
    options.GroupNameFormat = "'v'VVV";
    options.SubstituteApiVersionInUrl = true;
    //options.SubstitutionFormat = "'v'VVV";
);

结果:

【讨论】:

谢谢。除了删除SubstitutionFormat 之外,我尝试了您提到的所有内容。我想知道是什么破坏了路由。

以上是关于将 Swashbuckle 添加到 .NET Core Web API 应用程序后,访问版本化路由会返回 404的主要内容,如果未能解决你的问题,请参考以下文章

使用Swashbuckle Aspnetcore将`host`,`basePath`和`schemes`添加到swagger.json

有没有办法让 Swashbuckle 将 OData 参数添加到 Web API 2 IQueryable<T> 端点?

ASP.NET 核心:NSwag 与 Swashbuckle

Swagger UI 及Swashbuckle

asp.net core使用Swashbuckle.AspNetCore(swagger)生成接口文档

Swashbuckle .NET Core 2 中 JWT 承载的授权