Ошибка 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]