Mit der Web-API und Swashbuckle zum Generieren von Swagger-Dokumentation habe ich zwei verschiedene Klassen mit demselben Namen in zwei verschiedenen Namespaces definiert. Wenn ich die Prahlerseite in meinem Browser öffne, heißt es
Widersprüchliche Schema-IDs: Doppelte Schema-IDs, die für die Typen A und B erkannt wurden. Eine mögliche Problemumgehung finden Sie in der Konfigurationseinstellung "UseFullTypeNameInSchemaIds"
vollständige Nachricht:
500: {"Message": "Ein Fehler ist aufgetreten.", "ExceptionMessage": "Konflikte mit Schema-IDs: Doppelte Schema-IDs für Typ A und B erkannt. Eine mögliche Problemumgehung finden Sie in der Konfigurationseinstellung" UseFullTypeNameInSchemaIds "," ExceptionType " ":" System.InvalidOperationException "," StackTrace ":" bei Swashbuckle.Swagger.SchemaRegistry.CreateRefSchema (Typ Typ) \ r \ n bei Swashbuckle.Swagger.SchemaRegistry.CreateInlineSchema (Typ Typ) \ r \ n bei Swashbuckle.S. SchemaRegistry.b__1f (JsonProperty prop) \ r \ n bei System.Linq.Enumerable.ToDictionary [TSource, TKey, TElement] (IEnumerable
1 source, Func
2 keySelector, Func2 elementSelector, IEqualityComparer
1 Vergleicher) \ r \ n bei Swashbuckle.Swagger.SchemaRegistry.CreateObjectSchema (JsonObjectContract jsonContract) \ r \ n bei Swashbuckle.Swagger.SchemaRegistry.CreateDefinitionSchema (Type type) \ r \ n bei Swashbuckle.Rw ) \ r \ n bei Swashbuckle.Swagger.SwaggerGenerator.CreateOperation (ApiDescription apiDesc, SchemaRegistry schemaRegistry) \ r \ n bei Swashbuckle.Swagger.SwaggerGenerator.CreatePathItem (IEnumerable1 apiDescriptions, SchemaRegistry schemaRegistry)\r\n at Swashbuckle.Swagger.SwaggerGenerator.<>c__DisplayClass7.<GetSwagger>b__4(IGrouping
2 group) \ r \ n bei System.Lumerq. TSource, TKey, TElement] (IEnumerable1 source, Func
2 keySelector, Func2 elementSelector, IEqualityComparer
1 Vergleicher) \ r \ n bei Swashbuckle.Swagger.SwaggerGenerator.GetSwagger (String rootUrl, String apiVersion) \ r \ n bei Swashbuckle.Application.SwaggerDocsHandler.SendAsync (HttpRequestMessage request, CancellationToken n). Http.HttpMessageInvoker.SendAsync (HttpRequestMessage-Anforderung, CancellationToken CancellationToken) \ r \ n unter System.Web.Http.Dispatcher.HttpRoutingDispatcher.SendAsync (HttpRequestMessage-Anforderung, CancellationToken. HttpRequestMessage-Anforderung, CancellationToken CancellationToken) \ r \ n unter System.Web.Http.HttpServer.d__0.MoveNext () "} http: // localhost: 24215 / swagger / docs / v1
Ich möchte die Namen meiner Klassen nicht ändern. Wie kann ich es reparieren?
quelle
Ich habe endlich einen Weg in Prahlerei-Konfigurationen gefunden. Gehen Sie zur
App_Start\SwaggerConfig.cs
Datei undEnableSwagger
fügen Sie unter Lambda-Ausdruck diese Zeile hinzu:Der vollständige Code lautet wie folgt:
GlobalConfiguration.Configuration .EnableSwagger(c => { // your configs... c.SchemaId(x => x.FullName); // other configs... }) .EnableSwaggerUi(c => // .... });
quelle
Ich verwende Asp.net Core 2.1. Dieser Fehler trat auf, als ich versuchte, die Swagger-Benutzeroberfläche anzuzeigen.
Ich habe das Problem folgendermaßen gelöst:
In
Starup.cs
, inConfigureServices()
addc.CustomSchemaIds(i => i.FullName);
siehe Beispiel unten:
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); });
quelle
Wenn Sie auskommentieren oder hinzufügen:
In diesem Abschnitt scheint es dasselbe zu tun.
quelle
Für Swashbuckle.AspNetCore 5.2.1 (unter .NET Core 3.1) scheinen der Swashbuckle-Konfigurations-API die in den älteren Lösungen beschriebenen Optionen zu fehlen. Stattdessen hat die folgende Änderung in der
Startup.cs
für mich funktioniert:services.AddSwaggerGen(c => { // Existing configuration // Tweak to the Schema generator c.SchemaGeneratorOptions = new SchemaGeneratorOptions {SchemaIdSelector = type => type.FullName}; }
quelle
Wenn Ihr Modell generische Typen enthält, sollten Sie
Type.ToString()
anstelle von verwendenType.FullName
, um die für den generischen Parametertyp generierten Assembly-Informationen zu entfernen und Ihre Schema-IDs konsistenter zu gestalten.Beispiel zeigt den Unterschied auf
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]
quelle