93 votes

erreur swagger : Conflicting schemaIds : Duplicate schemaIds détecté pour les types A et B

Utilisation d'une API Web et utilisation de swashbuckle pour générer une documentation swagger, J'ai défini deux classes différentes avec le même nom dans deux espaces de noms différents. Lorsque j'ouvre la page swagger dans mon navigateur, le message suivant apparaît

Conflicting schemaIds : Duplicate schemaIds detected for types A and B. See the config setting - "UseFullTypeNameInSchemaIds" for a potential workaround

message complet :

500 : {"Message" : "Une erreur s'est produite.", "ExceptionMessage" : "Conflicting schemaIds : Duplicate schemaIds detected for types A and B. See the config setting - \"UseFullTypeNameInSchemaIds\" for a potential workaround", "ExceptionType" : "System.InvalidOperationException", "StackTrace" :" at Swashbuckle.Swagger.SchemaRegistry.CreateRefSchema(Type type) \r\n at Swashbuckle.Swagger.SchemaRegistry.CreateInlineSchema(Type type) \r\n at Swashbuckle.Swagger.SchemaRegistry.b__1f(JsonProperty prop) \r\n at System.Linq.Enumerable.ToDictionary[TSource,TKey,TElement](IEnumerable 1 source, Func 2 keySelector, Func 2 elementSelector, IEqualityComparer 1 comparateur) \r\n at Swashbuckle.Swagger.SchemaRegistry.CreateObjectSchema(JsonObjectContract jsonContract) \r\n at Swashbuckle.Swagger.SchemaRegistry.CreateDefinitionSchema(Type type) \r\n at Swashbuckle.Swagger.SchemaRegistry.GetOrRegister(Type type) \r\n at Swashbuckle.Swagger.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 2 groupes) \r\n at System.Linq.Enumerable.ToDictionary[TSource,TKey,TElement](IEnumerable 1 source, Func 2 keySelector, Func 2 elementSelector, IEqualityComparer 1 comparateur) \r\n at Swashbuckle.Swagger.SwaggerGenerator.GetSwagger(String rootUrl, String apiVersion) \r\n at Swashbuckle.Application.SwaggerDocsHandler.SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) \r\n at System.Net.Http.HttpMessageInvoker.SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) \r\n at System.Web.Http.Dispatcher.HttpRoutingDispatcher.SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) \r\n at System.Net.Http.DelegatingHandler.SendAsync(HttpRequestMessage request, CancellationToken cancellationToken) \r\n at System.Web.Http.HttpServer.d__0.MoveNext()"} http://localhost:24215/swagger/docs/v1

Je ne veux pas changer le nom de mes classes. Comment puis-je y remédier ?

148voto

Ghebrehiywet Points 448

Chaque classe dans le swagger JSON doit avoir un schemaId unique.

Swashbuckler essaie d'utiliser le nom de la classe comme simple identifiant de schéma, mais si vous avez deux classes dans des espaces de noms différents avec le même nom (comme vous le faites), cela ne fonctionnera pas.

Comme le suggère l'erreur, vous pouvez utiliser le paramètre de configuration "UseFullTypeNameInSchemaIds*" pour une solution de contournement potentielle (mise à jour : non disponible dans les versions récentes).

Dans les versions plus récentes, vous pouvez obtenir le même comportement via les options. CustomSchemaIds (x => x.FullName).

Voici un exemple :

   services.ConfigureSwaggerGen(options =>
   {
       //your custom configuration goes here

...

  // UseFullTypeNameInSchemaIds replacement for .NET Core
       options.CustomSchemaIds(x => x.FullName);
   });

pour plus d'informations http://wegotcode.com/microsoft/swagger-fix-for-dotnetcore/

1 votes

Si dans le cas où quelqu'un est ici de aspnetzero ou aspnetboilerplate ou la communauté abp. La même soulution s'applique, il suffit d'ajouter une option à services.AddSwaggerGen lorsque vous activez swagger.

2 votes

UseFullTypeNameInSchemaIds entraînera-t-il un changement de rupture pour les clients, car le ClassName court sera remplacé par le Namespace.ClassName long ?

61voto

Mahdi Ataollahi Points 639

J'ai finalement trouvé un moyen dans les configurations de swagger. Allez à App_Start\SwaggerConfig.cs et sous EnableSwagger l'expression lambda ajoute cette ligne :

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

Le code complet est comme ceci :

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

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

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

0 votes

J'ai fourni mon fichier Swagger.json à mes clients. Si je modifie en conséquence ce qui précède, ce changement va-t-il perturber les consommateurs actuels de mon API ?

34voto

Hidan Points 131

J'utilise Asp.net Core 2.1. Cette erreur s'est produite lorsque j'ai essayé d'afficher l'interface utilisateur Swagger.

J'ai résolu le problème de cette façon :

Sur Starup.cs en ConfigureServices() ajouter c.CustomSchemaIds(i => i.FullName);

voir l'exemple ci-dessous :

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

15voto

Karl Merecido Points 101

Si vous commentez ou ajoutez :

c.UseFullTypeNameInSchemaIds();

Dans cette section, il semble faire la même chose.

2 votes

Dans les versions récentes, UseFullTypeNameInSchemaIds n'est pas disponible. Utilisez c.CustomSchemaIds(x => x.FullName) ; à la place.

0 votes

N'est plus compatible

5voto

mguoth Points 1

Si votre modèle contient des types génériques, pensez à utiliser Type.ToString() au lieu de Type.FullName pour se débarrasser des informations d'assemblage générées pour le type de paramètre générique et rendre vos identifiants de schéma plus cohérents.

services.AddSwaggerGen(options =>
{
    options.CustomSchemaIds(type => type.ToString());
});

Exemple montrant la différence sur 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]

0 votes

Y aurait-il un gros problème si l'un des types a déjà défini ToString ? Ou si un développeur venait à le faire plus tard ?

1 votes

@Chris Vous annulez généralement ToString dans la classe, mais vous ne pouvez pas (facilement) remplacer Type.ToString . Donc, non, pas de problème.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X