Ошибка swagger: конфликтующие схемы: дублированные схемы, обнаруженные для типов A и B

Используя Web API и используя swashbuckle для создания документации swagger, Я определил два разных класса с одним и тем же именем в двух разных пространствах имен. когда я открываю страницу разворота в моем браузере, он говорит

Конфликтующие схемы: дублируются схемы для типов A и B. См. настройку конфигурации - "UseFullTypeNameInSchemaIds" для потенциального обходного пути

полное сообщение:

500: { "Сообщение": "Произошла ошибка.", "ExceptionMessage": "Conflicting schemaIds: обнаружены дублирующие схемы для типов A и B. См. настройку конфигурации -\UseFullTypeNameInSchemaIds \" для возможного обходного пути "," ExceptionType ":" System.InvalidOperationException "," StackTrace ":" на Swashbuckle.Swagger.SchemaRegistry.CreateRefSchema(тип типа)\r\n на Swashbuckle.Swagger.SchemaRegistry.CreateInlineSchema(тип типа)\r\n на Swashbuckle.Swagger.SchemaRegistry.b__1f (JsonProperty prop)\r\n в System.Linq.Enumerable.ToDictionary [TSource, TKey, TElement] (IEnumerable 1 source, Func 2 keySelector, Func 2 elementSelector, IEqualityComparer 1 сравнитель)\r\n на Swashbuckle.Swagger.SchemaRegistry.CreateObjectSchema(JsonObjectContract jsonContract)\r\n в Swashbuckle.Swagger.SchemaRegistry.CreateDefinitionSchema(тип типа)\r\n в Swashbuckle.Swagger.SchemaRegistry.GetOrRegister(тип типа)\r\n на Swashbuckle.Swagger.SwaggerGenerator.CreateOperation(ApiDescription apiDesc, SchemaRegistry schemaRegistry)\r\n в Swashbuckle.Swagger.SwaggerGenera tor.CreatePathItem(IEnumerable 1 apiDescriptions, SchemaRegistry schemaRegistry)\r\n at Swashbuckle.Swagger.SwaggerGenerator.<>c__DisplayClass7.<GetSwagger>b__4(IGrouping 2 группа)\r\n в System.Linq.Enumerable.ToDictionary [TSource, TKey, TElement] (IEnumerable 1 source, Func 2 keySelector, Func 2 elementSelector, IEqualityComparer 1 comparer)\r\n at Swashbuckle.Swagger.SwaggerGenerator.GetSwagger(String rootUrl, String apiVersion)\r\n в Swashbuckle.Application.SwaggerDocsHandler.SendAsync(запрос HttpRequestMessage, CancellationToken cancelationToken)\r\n в System.Net.Http.HttpMessageInvoker.SendAsync(запрос HttpRequestMessage, CancellationToken cancelationToken)\r\n в System.Web.Http.Dispatcher.HttpRoutingDispatcher.SendAsync(запрос HttpRequestMessage, CancellationToken cancelationToken)\r\n на System.Net.Http.DelegatingHandler.SendAsync(запрос HttpRequestMessage, CancellationToken cancelationToken)\r\n в System.Web.Http.HttpServer.d__0.MoveNext() "} http://localhost:24215/swagger/docs/v1

Я не хочу менять имена моих классов. Как я могу это исправить?

Ответ 1

Наконец-то я нашел способ в конфигурациях 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 =>
        // ....
    });

Ответ 2

Каждый класс JAON должен иметь уникальный schemaId.

Swashbuckler пытается просто использовать имя класса как простой schemaId, однако, если у вас есть два класса в разных пространствах имен с тем же именем (как и вы), это не сработает.

Как показывает ошибка, вы можете использовать настройку конфигурации " UseFullTypeNameInSchemaIds" для возможного обходного пути.

если ваша проблема заключается в том, как использовать "UseFullTypeNameInSchemaIds" в промежуточном программном обеспечении .NetCore? вы можете добиться такого же поведения с помощью options.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/

Ответ 3

Я использую 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);
        });

Ответ 4

Если вы закомментируете или добавите:

c.UseFullTypeNameInSchemaIds();

В этом разделе он, похоже, делает то же самое.

Ответ 5

Если ваша модель содержит универсальные типы, рассмотрите возможность использования Type.ToString() вместо Type.FullName чтобы избавиться от информации о сборке, сгенерированной для универсального типа параметра, и сделать ваши идентификаторы схемы более согласованными.

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]