大幅度的错误:冲突的schemaIds:检测到类型A和B重复的schemaIds


76

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

冲突的schemaIds:检测到类型A和B重复的schemaIds。有关可能的解决方法,请参阅配置设置-“ UseFullTypeNameInSchemaIds”

完整讯息:

500:{“消息”:“发生错误。”,“ ExceptionMessage”:“冲突的schemaId:检测到类型A和B的重复的schemaId。请参见配置设置-\” UseFullTypeNameInSchemaIds \“以获取可能的解决方法”,“ ExceptionType Swashbuckle.Swagger.SchemaRegistry.CreateRegistry.CreateInlineSchema(类型)\ r \ n在Swashbuckle.Swagger。“”:“ System.InvalidOperationException”,“ StackTrace”:“在Swashbuckle.Swagger中。 SchemaRegistry.b__1f(JsonProperty prop)\ r \ n位于System.Linq.Enumerable.ToDictionary [TSource,TKey,TElement](IEnumerable 1 source, Func2 keySelector,Func2 elementSelector, IEqualityComparer1比较器)\ r \ n在Swashbuckle.Swagger.SchemaRegistry.CreateObjectSchema(JsonObjectContract jsonContract)\ r \ n在Swashbuckle.Swagger.SchemaRegistry.CreateDefinitionSchema(Type type)\ r \ n在Swashbuckle.Swagger.SchemaRegistry.GetOrRegister(Type type )\ r \ n在Swashbuckle.Swagger.SwaggerGenerator.CreateOperation(ApiDescription apiDesc,SchemaRegistry schemaRegistry)\ r \ n在Swashbuckle.Swagger.SwaggerGenerator.CreatePathItem(IEnumerable 1 apiDescriptions, SchemaRegistry schemaRegistry)\r\n at Swashbuckle.Swagger.SwaggerGenerator.<>c__DisplayClass7.<GetSwagger>b__4(IGrouping2 group)\ r \ n在System.Linq.Enumerable.ToDictionary [ TSource,TKey,TElement](IEnumerable 1 source, Func2 keySelector,Func2 elementSelector, IEqualityComparer1个比较器)\ r \ n在Swashbuckle.Swagger.SwaggerGenerator.GetSwagger(字符串rootUrl,字符串apiVersion)\ r \ n在Swashbuckle.Application.SwaggerDocsHandler.SendAsync(HttpRequestMessage请求,CancellationToken cancelToken)在System.Net。 Http.HttpMessageInvoker.SendAsync(HttpRequestMessage请求,CancellationToken cancelToken)\ r \ n在System.Web.Http.Dispatcher.HttpRoutingDispatcher.SendAsync(HttpRequestMessage请求,CancellationToken cancelToken)\ r \ n在System.Net.Http.DelegatingHandler.SendAsync( HttpRequestMessage请求,CancelationToken cancellingToken)\ r \ n位于System.Web.Http.HttpServer.d__0.MoveNext()“} http:// localhost:24215 / swagger / docs / v1

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

Answers:


122

招摇的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/


1
如果是aspnetzero或aspnetboilerplate或abp社区提供的任何内容。相同的解决方案仅在service.AddSwaggerGen启用swagger时应用添加选项
Avi

1
UseFullTypeNameInSchemaIds是否会导致客户端的重大更改,因为将用长Namespace.ClassName替换短的ClassName?
Michael Freidgeim

53

我终于找到了招摇的配置方法。转到App_Start\SwaggerConfig.cs文件,然后在EnableSwaggerlambda表达式下添加以下行:

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

完整的代码是这样的:

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

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

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

28

我正在使用Asp.net Core 2.1。当我尝试显示Swagger UI时导致此错误。

我这样解决了这个问题:

在中Starup.csConfigureServices()添加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);
        });

14

如果您注释掉或添加:

c.UseFullTypeNameInSchemaIds();

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


1
在最新版本中,UseFullTypeNameInSchemaIds不可用。使用c.CustomSchemaIds(x => x.FullName); 而是
迈克尔Freidgeim

4

对于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};
  }

3

如果您的模型包含泛型类型,请考虑使用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]

如果其中一种类型已经定义了ToString,将会有很大的问题吗?或者,如果开发人员进来了,后来又做了?
克里斯,
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.