为什么 swagger 在 .NET 6 中打不开?

Why the swagger doesn't open in .NET 6?

嗯,我在做一个 DDD 项目,特别是使用 redis,但我认为这与它没有任何关系。

问题是,swagger 没有出现在我身上,它失败了,但是当我在 postman 中发出请求时它工作正常。

那是错误:

 Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware[1]
  An unhandled exception has occurred while executing the request.
  System.TypeLoadException: Could not load type 'Microsoft.AspNetCore.Http.Metadata.ITagsMetadata' from assembly 'Microsoft.AspNetCore.Http.Abstractions, Version=6.0.0.0, Culture=neutral, PublicKeyToken=adb9793829ddae60'.
     at Swashbuckle.AspNetCore.SwaggerGen.SwaggerGeneratorOptions.DefaultTagsSelector(ApiDescription apiDescription)
     at Swashbuckle.AspNetCore.SwaggerGen.SwaggerGeneratorOptions.DefaultSortKeySelector(ApiDescription apiDescription) in Swashbuckle.AspNetCore.SwaggerGen.dll:token 0x600012d+0x0
     at System.Linq.EnumerableSorter`2.ComputeKeys(TElement[] elements, Int32 count) in System.Linq.dll:token 0x600040b+0x10
     at System.Linq.EnumerableSorter`1.ComputeMap(TElement[] elements, Int32 count) in System.Linq.dll:token 0x6000401+0x0
     at System.Linq.EnumerableSorter`1.Sort(TElement[] elements, Int32 count) in System.Linq.dll:token 0x6000402+0x0
     at System.Linq.OrderedEnumerable`1.GetEnumerator()+MoveNext() in System.Linq.dll:token 0x6000391+0x3d
     at System.Linq.Lookup`2.Create(IEnumerable`1 source, Func`2 keySelector, IEqualityComparer`1 comparer) in System.Linq.dll:token 0x6000366+0x2b
     at System.Linq.GroupedEnumerable`2.GetEnumerator() in System.Linq.dll:token 0x600035f+0x0
     at Swashbuckle.AspNetCore.SwaggerGen.SwaggerGenerator.GeneratePaths(IEnumerable`1 apiDescriptions, SchemaRepository schemaRepository) in Swashbuckle.AspNetCore.SwaggerGen.dll:token 0x60000f8+0x3a
     at Swashbuckle.AspNetCore.SwaggerGen.SwaggerGenerator.GetSwagger(String documentName, String host, String basePath) in Swashbuckle.AspNetCore.SwaggerGen.dll:token 0x60000f6+0xe6
     at Swashbuckle.AspNetCore.Swagger.SwaggerMiddleware.Invoke(HttpContext httpContext, ISwaggerProvider swaggerProvider) in Swashbuckle.AspNetCore.Swagger.dll:token 0x6000009+0xe2
     at Microsoft.AspNetCore.Diagnostics.DeveloperExceptionPageMiddleware.Invoke(HttpContext context) in Microsoft.AspNetCore.Diagnostics.dll:token 0x60000aa+0x82

启动文件(ConfigureServices):

public void ConfigureServices(IServiceCollection services)
{
        services.AddRedisContext(Configuration);
        services.AddControllers();
        services.AddSwaggerGen(c =>
        {
            c.SwaggerDoc("v1", new OpenApiInfo { Title = "Basket.Api", Version = "v1" 
        });
});

扩展方法中我的方法class:

public static IServiceCollection AddRedisContext(this IServiceCollection services, IConfiguration config)
{
        services.AddStackExchangeRedisCache(options =>
        {                
            options.Configuration = config["CacheSettings:ConnectionString"];
        });

        services.AddScoped<IBasketRepository, BasketRepository>();
        services.AddScoped<IBasketService, BasketService>();

        return services;
 }

包参考:

<Project Sdk="Microsoft.NET.Sdk.Web">

  <PropertyGroup>
    <TargetFramework>net6.0</TargetFramework>
  </PropertyGroup>

  <ItemGroup>    
    <PackageReference Include="Swashbuckle.AspNetCore" Version="6.2.3" />
  </ItemGroup>

  <ItemGroup>
    <ProjectReference Include="..\Basket.Infra.Data\Basket.Infra.Data.csproj" />
  </ItemGroup>

</Project>

我也评论了引用redis的行,它仍然给出了同样的错误。所以这几乎可以肯定是涉及招摇的事情。

在我的例子中,是 SDK 不是 运行 正确的 net6.0 版本。

虽然整个项目都在使用新的 net6.0 NuGet 包,但我正在使用的那台机器上的本地 SDK 仍然是 net5.0。安装完.net6.0后,Swashbuckle 6.2.3又可以正常运行了,一切正常