web-dev-qa-db-ja.com

swaggerエラー:schemaIdsの競合:タイプAおよびBのschemaIdsの重複が検出されました

Web APIを使用し、swashbuckleを使用してSwaggerドキュメントを生成するために、2つの異なる名前空間で同じ名前の2つの異なるクラスを定義しました。ブラウザでswaggerページを開くと、

競合するschemaIds:タイプAおよびBの重複したschemaIdsが検出されました。潜在的な回避策については、構成設定「UseFullTypeNameInSchemaIds」を参照してください。

完全なメッセージ:

500:{"メッセージ": "エラーが発生しました。"、 "ExceptionMessage": "スキーマIDの競合:タイプAおよびBで重複したschemaIdが検出されました。 ":" System.InvalidOperationException "、" StackTrace ":" Swashbuckle.Swagger.SchemaRegistry.CreateRefSchema(Type type)で\ r\n Swashbuckle.Swagger.SchemaRegistry.CreateInlineSchema(Type type)\ r\n at Swashbuckle.Swaggerで。 SchemaRegistry.b__1f(JsonProperty prop)\ r\n System.Linq.Enumerable.ToDictionary [TSource、TKey、TElement](IEnumerable1 source, Func2 keySelector、Func2 elementSelector, IEqualityComparer1 comparer)\ r\n at Swashbuckle.Swagger。 SchemaRegistry.CreateObjectSchema(JsonObjectContract jsonContract)\ r\n Swashbuckle.Swagger.SchemaRegistry.CreateDefinitionSchema(Type type)\ r\n at Swashbuckle.Swagger.SchemaRegistry.GetOrRegister(Type type)\ r\n at Swashbuckle.Swagger.Swagger.Swagger.erator CreateOperation(ApiDescription apiDesc、SchemaRegistry schemaRegistry)\ r\n Swashbuckle.Swagger.Sw aggerGenerator.CreatePathItem(IEnumerable1 apiDescriptions, SchemaRegistry schemaRegistry)\r\n at Swashbuckle.Swagger.SwaggerGenerator.<>c__DisplayClass7.<GetSwagger>b__4(IGrouping2グループ)\ r\n System.Linq.Enumerable.ToDictionary [TSource、TKey、TElement](IEnumerable1 source, Func2 keySelector、Func2 elementSelector, IEqualityComparer1 comparer)\ r\n Swashbuckle.Swagger.SwaggerGenerator.GetSwagger(String rootUrl、String apiVersion)\ r\n Swashbuckle.Application.SwaggerDocsHandler.SendAsync(HttpRequestMessage request、CancellationToken cancelToken)\ r\n at System.Net.Http.HttpMessageInvoker.SendAsync(HttpRequestMessage request) 、CancellationToken cancelToken)\ r\n System.Web.Http.Dispatcher.HttpRoutingDispatcher.SendAsync(HttpRequestMessage request、CancellationToken cancelToken)\ r\n System.Net.Http.DelegatingHandler.SendAsync(HttpRequestMessage request、CancellationToken cancelToken)\ r\n System.Web.Http.HttpServer.d__0.MoveNext() "}で http:// localhost:24215/swagger/docs/v1

クラスの名前を変更したくありません。どうすれば修正できますか?

40
Mahdi Ataollahi

私はついにswagger configの方法を見つけました。 App_Start\SwaggerConfig.csファイルに移動し、EnableSwaggerラムダ式の下に次の行を追加します。

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

完全なコードは次のとおりです。

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

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

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

Swagger JSONのすべてのクラスには、一意のschemaIdが必要です。

Swashbucklerはクラス名を単純なschemaIdとして使用しようとしますが、異なる名前空間に同じ名前の2つのクラスがある場合(これと同じように)これは機能しません。

エラーが示唆するように、潜在的な回避策として構成設定「UseFullTypeNameInSchemaIds」を使用できます。

あなたの懸念が.NetCoreミドルウェアで「UseFullTypeNameInSchemaIds」を使用する方法である場合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/

62
Ghebrehiywet

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

コメントアウトまたは追加する場合:

c.UseFullTypeNameInSchemaIds();

そのセクションでは、同じことをしているようです。

7
Karl Merecido

モデルにジェネリック型が含まれる場合は、Type.FullNameの代わりにType.ToString()を使用して、ジェネリックパラメーター型に対して生成されたアセンブリ情報を取り除き、スキーマIDの一貫性を高めることを検討してください。

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]
0
mguoth