招摇错误:schemaIds 冲突:检测到类型 A 和 B 的重复 schemaIds

问题描述 投票:0回答:8

使用Web API并使用swashbuckle生成swagger文档, 我在两个不同的命名空间中定义了两个具有相同名称的不同类。当我在浏览器中打开 swagger 页面时,它显示

schemaId 冲突:检测到类型 A 和 B 的 schemaId 重复。请参阅配置设置 -“UseFullTypeNameInSchemaIds”以获取潜在的解决方法

完整消息:

500 : {"Message":"发生错误。","ExceptionMessage":"schemaIds 冲突:检测到类型 A 和 B 的 schemaId 重复。请参阅配置设置 - \"UseFullTypeNameInSchemaIds\" 了解潜在的解决方法"," ExceptionType":"System.InvalidOperationException","StackTrace":" 在 Swashbuckle.Swagger.SchemaRegistry.CreateRefSchema(类型类型) 在 Swashbuckle.Swagger.SchemaRegistry.CreateInlineSchema(类型类型) 在 Swashbuckle.Swagger.SchemaRegistry.b__1f(JsonProperty 道具) 在 System.Linq.Enumerable.ToDictionary[TSource,TKey,TElement](IEnumerable

1 source, Func
2 keySelector,Func
2 elementSelector, IEqualityComparer
1 比较器) 在 Swashbuckle.Swagger.SchemaRegistry.CreateObjectSchema(JsonObjectContract jsonContract) 在 Swashbuckle.Swagger.SchemaRegistry.CreateDefinitionSchema(类型类型) 在 Swashbuckle.Swagger.SchemaRegistry.GetOrRegister(类型类型) 在 Swashbuckle.Swagger.SwaggerGenerator.CreateOperation(ApiDescription apiDesc,SchemaRegistry schemaRegistry) 在 Swashbuckle.Swagger.SwaggerGenerator.CreatePathItem(IEnumerable
1 apiDescriptions, SchemaRegistry schemaRegistry)\r\n at Swashbuckle.Swagger.SwaggerGenerator.<>c__DisplayClass7.<GetSwagger>b__4(IGrouping
2 组) 在 System.Linq.Enumerable.ToDictionary[TSource,TKey,TElement](IEnumerable
1 source, Func
2 keySelector,Func
2 elementSelector, IEqualityComparer
1 比较器) 在 Swashbuckle.Swagger.SwaggerGenerator.GetSwagger(字符串 rootUrl,字符串 apiVersion) 在Swashbuckle.Application.SwaggerDocsHandler.SendAsync(HttpRequestMessage请求,CancellationToken取消令牌) 在System.Net.Http.HttpMessageInvoker.SendAsync(HttpRequestMessage请求,CancellationToken取消令牌) 在System.Web.Http.Dispatcher.HttpRoutingDispatcher.SendAsync(HttpRequestMessage请求,CancellationToken取消令牌) 在System.Net.Http.DelegatingHandler.SendAsync(HttpRequestMessage请求,CancellationToken取消令牌) 在 System.Web.Http.HttpServer.d__0.MoveNext()"} http://localhost:24215/swagger/docs/v1

我不想更改班级名称。我该如何解决它?

c# asp.net-web-api swagger asp.net-web-api2 swashbuckle
8个回答
166
投票

swagger JSON 中的每个类都必须有一个唯一的 schemaId。

Swashbuckler 尝试仅使用类名作为简单的 schemaId,但是如果您在不同的命名空间中有两个具有相同名称的类(如您所做的那样),则这将不起作用。

如错误所示,您可以使用配置设置“UseFullTypeNameInSchemaIds*”作为潜在的解决方法(更新:在最新版本中不可用)

在较新的版本中,您可以通过选项实现相同的行为。CustomSchemaIds(x => x.FullName)。

这是一个例子:

   services.ConfigureSwaggerGen(options =>
   {
       //your custom configuration goes here

...

  // UseFullTypeNameInSchemaIds replacement for .NET Core
       options.CustomSchemaIds(x => x.FullName);
   });

了解更多信息http://wegotcode.com/microsoft/swagger-fix-for-dotnetcore/


68
投票

我终于在 swagger 配置中找到了一种方法。转到

App_Start\SwaggerConfig.cs
文件并在
EnableSwagger
lambda 表达式下添加以下行:

c.SchemaId(x => x.FullName);

完整代码如下:

GlobalConfiguration.Configuration 
    .EnableSwagger(c =>
    {
        // your configs...

        c.SchemaId(x => x.FullName);

        // other configs...
    })
    .EnableSwaggerUi(c =>
        // ....
    });

34
投票

我使用的是Asp.net Core 2.1。当我尝试显示 Swagger UI 时出现此错误。

我是这样解决问题的:

Starup.cs
中,在
ConfigureServices()
中添加
c.CustomSchemaIds(i => i.FullName);

参见下面的示例:

services.AddSwaggerGen(c =>
        {
            c.SwaggerDoc("v1", new Info
            {
                Title = "ASP.NET Core 2.1+ ConsumerApp API",
                Version = "v1"
            });
            // Set the comments path for the Swagger JSON and UI.
            var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";
            var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile);
            c.IncludeXmlComments(xmlPath);
            c.CustomSchemaIds(i => i.FullName);
        });

16
投票

如果您注释掉或添加:

c.UseFullTypeNameInSchemaIds();

在该部分中,它似乎做了同样的事情。


13
投票

对于 Swashbuckle.AspNetCore 5.2.1(在 .NET Core 3.1 上),Swashbuckle 配置 API 似乎缺少旧解决方案中描述的选项。相反,

Startup.cs
中的以下更改对我有用:

  services.AddSwaggerGen(c =>
  {
     // Existing configuration

     // Tweak to the Schema generator
     c.SchemaGeneratorOptions = new SchemaGeneratorOptions {SchemaIdSelector = type => type.FullName};
  }

6
投票

如果您的模型包含泛型类型,请考虑使用

Type.ToString()
而不是
Type.FullName
来消除为泛型参数类型生成的程序集信息,并使您的架构 ID 更加一致。

services.AddSwaggerGen(options =>
{
    options.CustomSchemaIds(type => type.ToString());
});

显示

List<string>
差异的示例:

Console.WriteLine(typeof(List<string>).FullName);
Console.WriteLine(typeof(List<string>).ToString());

// Output:
//    System.Collections.Generic.List`1[[System.String, mscorlib, Version=4.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089]]
//    System.Collections.Generic.List`1[System.String]

0
投票

如果您在有效负载中使用泛型类型并且使用 Nswag 代理客户端,则应该考虑这样做。

services.AddSwaggerGen(options =>
{
    options.CustomSchemaIds(type => type.ToString().Replace("`1", ""));
});

原因是在使用 Nswag 时避免这种类型的输出。

Replace("`1", "") 将格式化泛型类型并产生更干净的客户端:


-1
投票

就我而言,我的 2 个微服务项目(A 和 B)中有 2 个相同的类。

当我打开项目(A)中的dependency文件夹时,我发现我错误地添加了另一个项目(B)作为对该项目的引用。

删除我的两个项目之间的依赖关系之后解决了冲突。

© www.soinside.com 2019 - 2024. All rights reserved.