1. ホーム
  2. c#

[解決済み] swagger エラー。SchemaIds が矛盾しています。タイプ A と B で重複した schemaIds が検出されました。

2023-03-22 13:36:04

質問

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

conflicting schemaIds: 回避策として、設定 - "UseFullTypeNameInSchemaIds"を参照してください。

メッセージの全文を表示します。

<ブロッククオート

500 : {"Message":"An error has occurred.","ExceptionMessage":"Conflicting schemaIds.タイプAとタイプBで重複したスキーマIDを検出しました。Duplicate schemaIds detected for types A and B. See the config setting - UseFullTypeNameInSchemaIds" for a potential workaround","ExceptionType":"System.InvalidOperationException","StackTrace":" at Swashbuckle.StackTrace" at swagger.SchemaRegacy";Duplicate schemaIds detected for types A and B. For the Duplicate schemaIds. at Swashbuckle.SchemaRegistry.CreateRefSchema(Type type)\rn at Swashbuckle.Swagger.SchemaRegistry.CreateInlineSchema(Type type)\rn at Swashbuckle.Swagger.SchemaRegistry.b__1f(JsonProperty prop)\rng at System.Linq.Enumerable.ToDictionary[TSource,TKey,TElement](IEnumerable) 1 source, Func 2 keySelector, Func 2 elementSelector, IEqualityComparer 1 comparer)\rn at Swashbuckle.Swagger.SchemaRegistry.CreateObjectSchema(JsonObjectContract jsonContract)\rn at Swashbuckle.Swagger.SchemaRegistry.CreateDefinitionSchema(Type type)\rn at Swashbuckle.Swagger.SchemaRegistry.CreateDefinity(Type type type)\rn at Swashbuckle.SchemaRegistry.CreateDefinitionSchema(Type type type))\rrr (@Swashback.Swagger.SchemaRgistry.CreateDefinitionSchema(Type type)) GetOrRegister(Type type)\n at Swashbuckle.Swagger.SwaggerGenerator.CreateOperation(ApiDescription apiDesc, SchemaRegistry schemaRegistry)\rng at Swashbuckle.Swagger.SwaggerGenerator.CreatePathItem(IEnumerable) 1 apiDescriptions, SchemaRegistry schemaRegistry)\r\n at Swashbuckle.Swagger.SwaggerGenerator.<>c__DisplayClass7.<GetSwagger>b__4(IGrouping 2 group)\ at System.Linq.Enumerable.ToDictionary[TSource,TKey,TElement](IEnumerable 1 source, Func 2 keySelector, Func 2 elementSelector, IEqualityComparer 1 comparer)\n at Swashbuckle.Swagger.SwaggerGenerator.GetSwagger(String rootUrl, String apiVersion)\n at Swashbuckle.Application.SwaggerDocsHandler.SendSync(HttpRequestMessage request, CancellationToken))\[email protected](String rootUrl, String apiVersion)) SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)\n at System.Net.Http.HttpMessageInvoker.SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)\n at System.Net.Http.HttpMessageInvoker.SendAsync(HttpMessage request, CancellationToken cancellToken) System.Net.Http.DelegatingHandler.SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)\at System.Net.Http.DelegatingHandler.SendAsync(HttpRequestMessage request, CancellationToken cancellationToken)\at System.Web.Http.HttpServer.d__0.MoveNext()"} は、SYNAME.Web.Dispatcher.HttpRoutingDispatcher.SendAsync (HttpRequestMessage request, CancellationToken cancellationToken )で表示されます。 http://localhost:24215/swagger/docs/v1

クラスの名前を変えたくありません。どうすれば直せますか?

どのように解決するのですか?

swaggerのコンフィグでようやく方法を見つけました。以下のように 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 =>
        // ....
    });