Swashbuckle.AspNetCore:“规范中未定义任何操作!” 'Microsoft.AspNetCore.Mvc.ApiExplorer'程序包更新到2.2.0后出现的问题

时间:2019-05-30 17:28:50

标签: asp.net-core swashbuckle

我们有使用Swagger的.net core 2.1 mvc webapi项目。 我们使用以下软件包:

<PackageReference Include="Swashbuckle.AspNetCore" Version="3.0.0" />
<PackageReference Include="Swashbuckle.AspNetCore.Annotations" Version="3.0.0" />
<PackageReference Include="Swashbuckle.AspNetCore.Filters" Version="4.3.0" />
<PackageReference Include="Microsoft.AspNetCore.Mvc.ApiExplorer" Version="2.1.2" />
<PackageReference Include="Microsoft.AspNetCore.Mvc.Versioning.ApiExplorer" Version="2.2.0" />
<PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="2.1.1" />

swashbuckle通过以下方式配置:

services.AddMvcCore().AddVersionedApiExplorer();
services.AddApiVersioning();
services.AddSwaggerGen();

这种设置中的所有功能(/swagger/v1/swagger.json具有所有操作和定义,并且UI呈现正确->具有所有控制器和动作等)

我们正在尝试将.net核心项目从2.1迁移到2.2 .net核心。

为此(无警告),我们需要将Microsoft.AspNetCore.Mvc.ApiExplorer nuget从2.1.2升级到2.2.0。

在此nuget更新之后,swagger.json(/swagger/v1/swagger.json)不包含任何"paths": {}"definitions": {},这将导致swagger UI显示没有控制器/动作(它呈现:{{ 1}}

升级软件包后,以下软件包版本将更新:

No operations defined in spec!

我尝试将swashbuckle版本升级到v4.0.0,但未能解决问题。

我还缺少哪些包也需要更新,以便在使用<PackageReference Include="Microsoft.AspNetCore.Mvc.ApiExplorer" Version="2.2.0" /> //was 2.1.2 <PackageReference Include="Microsoft.Extensions.DependencyInjection" Version="2.2.0" /> //was 2.1.1 包时可以正确生成swagger.json? 还是我想念其他东西?

3 个答案:

答案 0 :(得分:8)

刚刚遇到了同样的问题,我想我也会分享我的解决方案。 6.0.4 版本。

我必须将 [ApiController] 属性添加到我的控制器中。 Swagger 必须使用它来进行发现。

答案 1 :(得分:2)

  • 将控制器中的公共方法更改为[NoAction]属性。

  • 此外,将所有具有显式操作方法的操作更改为[HttpGet(“ api / get-customer”)],[HttpPost(“ api / save-customer”)],而不是[Route(“ api / get / -customer“)]。

答案 2 :(得分:0)

我找到了解决此问题的方法(也发布到了https://github.com/domaindrivendev/Swashbuckle.AspNetCore/issues/1166#issuecomment-497800414

简而言之:我需要将HOST项目SDK从“ Microsoft.NET.Sdk”更改为“ Microsoft.NET.Sdk.Web”。

我没有明确确定是否应该像这样(但默认Microsoft模板在.net core 2.2中使用此SDK)

因此,如果有人能解释为什么从.net core 2.1迁移到2.2后需要使用.Web SDK,那就太好了