webapi net implement how asp c# asp.net-web-api asp.net-web-api2 swagger-ui swashbuckle

c# - net - error de swagger: Conflicto de SchemaIds: Duplicate schemaIds detectado para los tipos A y B



how to implement swagger in web api c# (4)

Cada clase en el JSON swagger debe tener un schemaId único.

Swashbuckler intenta usar el nombre de la clase como un simple schemaId, sin embargo, si tiene dos clases en diferentes espacios de nombres con el mismo nombre (como lo hace), esto no funcionará.

Como sugiere el error, puede usar la configuración de configuración " UseFullTypeNameInSchemaIds " para una posible solución.

Si su inquietud es ¿Cómo usar "UseFullTypeNameInSchemaIds" en middleware .NetCore? puede lograr el mismo comportamiento a través de opciones.CustomSchemaIds (x => x.FullName).

Aquí hay un ejemplo:

services.ConfigureSwaggerGen(options => { //your custom configuration goes here ... // UseFullTypeNameInSchemaIds replacement for .NET Core options.CustomSchemaIds(x => x.FullName); });

para obtener más información http://wegotcode.com/microsoft/swagger-fix-for-dotnetcore/

Usando la API web y usando swashbuckle para generar documentación de Swagger, definí dos clases diferentes con el mismo nombre en dos espacios de nombres diferentes. Cuando abro la página de Swagger en mi navegador dice

SchemaIds en conflicto: se detectaron SchemaIds duplicados para los tipos A y B. Consulte la configuración: "UseFullTypeNameInSchemaIds" para una solución potencial

mensaje completo:

500: {"Mensaje": "Ha ocurrido un error.", "Mensaje de excepción": "Conflicto de los esquemas del esquema: Se detectaron esquemas duplicados para los tipos A y B. Vea la configuración de configuración -" UseFullTypeNameInSchemaIds / "para una solución potencial", "ExceptionType ":" System.InvalidOperationException "," StackTrace ":" en Swashbuckle.Swagger.SchemaRegistry.CreateRefSchema (Type type) / r / n en Swashbuckle.Swagger.SchemaRegistry.CreateInlineSchema (Type type) / r / n en. SchemaRegistry.b__1f (JsonProperty prop) / r / n en System.Linq.Enumerable.ToDictionary [TSource, TKey, TElement] (IEnumerable 1 source, Func 2 keySelector, Func 2 elementSelector, IEqualityComparer 1 2 elementSelector, IEqualityComparer ) / r / n at Swashbuckle. Swagger.SchemaRegistry.CreateObjectSchema (JsonObjectContract jsonContract) / r / n en Swashbuckle.Swagger.SchemaRegistry.CreateDefinitionSparta_Aparmenta del tipo de reposo por lo que se refiere a la instalación de un evento. SwaggerGenerator.CreateOperation (ApiDescription apiDesc, SchemaRegistry schemaRegistry) / r / n at Swashbuckle.Swagger.SwaggerGenerator.CreatePathItem (IEnumerable 1 apiDescriptions, SchemaRegistry schemaRegistry)/r/n at Swashbuckle.Swagger.SwaggerGenerator.<>c__DisplayClass7.<GetSwagger>b__4(IGrouping .Linq.Enumerable.ToDictionary [TSource, TKey, TElement] (IEnumerable 1 source, Func 2 keySelector, Func 2 elementSelector, IEqualityComparer 1 2 elementSelector, IEqualityComparer ) / r n at Swashbuckle.Swagger.SwaggerGenerator.GetSwagger (String rootUrl) r / n at Swashbuckle.Application.SwaggerDocsHandler.SendAsync (solicitud HttpRequestMessage, Cancelación de cancelación de llamadaToken) / r / n en System.Net.Http. Dispatcher.HttpRoutingDispatcher.SendAsync (solicitud HttpRequestMessage, Cancelación de cancelaciónTokenToken) / r / n en System.Net.Http.DelegatingHandler.pel.pel.pel.png.png .MoveNext () "} http://localhost:24215/swagger/docs/v1

No quiero cambiar los nombres de mis clases. ¿Cómo puedo arreglarlo?


Estoy usando Asp.net Core 2.1. Este error resultó cuando intenté mostrar la interfaz de usuario de Swagger.

Resolví el problema de esta manera:

En Starup.cs , en ConfigureServices() agregue c.CustomSchemaIds(i => i.FullName);

ver ejemplo a continuación:

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); });


Finalmente encontré un camino en confabulaciones confusas. Vaya al archivo App_Start/SwaggerConfig.cs y en la expresión lambda EnableSwagger agregue esta línea:

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

El código completo es así:

GlobalConfiguration.Configuration .EnableSwagger(c => { // your configs... c.SchemaId(x => x.FullName); // other configs... }) .EnableSwaggerUi(c => // .... });


Si usted comenta o agrega:

c.UseFullTypeNameInSchemaIds();

En esa sección, parece hacer lo mismo.