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](IEnumerable
1 source, Func
2 keySelector、Func2 elementSelector, IEqualityComparer
1 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(IGrouping
2グループ)\ r\n System.Linq.Enumerable.ToDictionary [TSource、TKey、TElement](IEnumerable1 source, Func
2 keySelector、Func2 elementSelector, IEqualityComparer
1 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
クラスの名前を変更したくありません。どうすれば修正できますか?
私はついに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 =>
// ....
});
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/
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);
});
コメントアウトまたは追加する場合:
c.UseFullTypeNameInSchemaIds();
そのセクションでは、同じことをしているようです。
モデルにジェネリック型が含まれる場合は、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]