I'm getting this error because I think that for some reason it conflicts with a class that I have called Module. Changing the name of that class is not an option, so is there a way to fix this? Maybe the best question is; why does this error even occur at all?
Can't use schemaId "$Module" for type "$System.Reflection.Module". The same schemaId is already used for type "$Prjct.Data.Models.Module"
Swashbuckle.AspNetCore.Swagger version 5.2.1
Stacktrace:
Can't use schemaId "$Module" for type "$System.Reflection.Module". The same schemaId is already used for type "$SAM.Data.Models.Module"
at Swashbuckle.AspNetCore.SwaggerGen.SchemaRepository.ReserveIdFor(Type type, String schemaId)
at Swashbuckle.AspNetCore.SwaggerGen.SchemaRepository.GetOrAdd(Type type, String schemaId, Func`1 factoryMethod)
at Swashbuckle.AspNetCore.SwaggerGen.SchemaGenerator.GenerateReferencedSchema(SerializerContract serializerContract, SchemaRepository schemaRepository)
at Swashbuckle.AspNetCore.SwaggerGen.SchemaGenerator.GenerateSchemaForType(Type type, SchemaRepository schemaRepository)
at Swashbuckle.AspNetCore.SwaggerGen.SchemaGenerator.GenerateSchema(Type type, SchemaRepository schemaRepository, MemberInfo memberInfo, ParameterInfo parameterInfo)
at Swashbuckle.AspNetCore.SwaggerGen.SchemaGenerator.GenerateObjectSchema(SerializerContract serializerContract, SchemaRepository schemaRepository)
at Swashbuckle.AspNetCore.SwaggerGen.SchemaGenerator.GenerateInlineSchema(SerializerContract serializerContract, SchemaRepository schemaRepository)
at Swashbuckle.AspNetCore.SwaggerGen.SchemaGenerator.<>c__DisplayClass6_0.<GenerateReferencedSchema>b__0()
at Swashbuckle.AspNetCore.SwaggerGen.SchemaRepository.GetOrAdd(Type type, String schemaId, Func`1 factoryMethod)
at Swashbuckle.AspNetCore.SwaggerGen.SchemaGenerator.GenerateReferencedSchema(SerializerContract serializerContract, SchemaRepository schemaRepository)
at Swashbuckle.AspNetCore.SwaggerGen.SchemaGenerator.GenerateSchemaForType(Type type, SchemaRepository schemaRepository)
at Swashbuckle.AspNetCore.SwaggerGen.SchemaGenerator.GenerateSchema(Type type, SchemaRepository schemaRepository, MemberInfo memberInfo, ParameterInfo parameterInfo)
at Swashbuckle.AspNetCore.SwaggerGen.SchemaGenerator.GenerateArraySchema(SerializerContract serializerContract, SchemaRepository schemaRepository)
at Swashbuckle.AspNetCore.SwaggerGen.SchemaGenerator.GenerateInlineSchema(SerializerContract serializerContract, SchemaRepository schemaRepository)
at Swashbuckle.AspNetCore.SwaggerGen.SchemaGenerator.GenerateSchemaForType(Type type, SchemaRepository schemaRepository)
at Swashbuckle.AspNetCore.SwaggerGen.SchemaGenerator.GenerateSchema(Type type, SchemaRepository schemaRepository, MemberInfo memberInfo, ParameterInfo parameterInfo)
at Swashbuckle.AspNetCore.SwaggerGen.SchemaGenerator.GenerateObjectSchema(SerializerContract serializerContract, SchemaRepository schemaRepository)
at Swashbuckle.AspNetCore.SwaggerGen.SchemaGenerator.GenerateInlineSchema(SerializerContract serializerContract, SchemaRepository schemaRepository)
at Swashbuckle.AspNetCore.SwaggerGen.SchemaGenerator.<>c__DisplayClass6_0.<GenerateReferencedSchema>b__0()
at Swashbuckle.AspNetCore.SwaggerGen.SchemaRepository.GetOrAdd(Type type, String schemaId, Func`1 factoryMethod)
at Swashbuckle.AspNetCore.SwaggerGen.SchemaGenerator.GenerateReferencedSchema(SerializerContract serializerContract, SchemaRepository schemaRepository)
at Swashbuckle.AspNetCore.SwaggerGen.SchemaGenerator.GenerateSchemaForType(Type type, SchemaRepository schemaRepository)
at Swashbuckle.AspNetCore.SwaggerGen.SchemaGenerator.GenerateSchema(Type type, SchemaRepository schemaRepository, MemberInfo memberInfo, ParameterInfo parameterInfo)
at Swashbuckle.AspNetCore.SwaggerGen.SchemaGenerator.GenerateArraySchema(SerializerContract serializerContract, SchemaRepository schemaRepository)
at Swashbuckle.AspNetCore.SwaggerGen.SchemaGenerator.GenerateInlineSchema(SerializerContract serializerContract, SchemaRepository schemaRepository)
at Swashbuckle.AspNetCore.SwaggerGen.SchemaGenerator.GenerateSchemaForType(Type type, SchemaRepository schemaRepository)
at Swashbuckle.AspNetCore.SwaggerGen.SchemaGenerator.GenerateSchema(Type type, SchemaRepository schemaRepository, MemberInfo memberInfo, ParameterInfo parameterInfo)
at Swashbuckle.AspNetCore.SwaggerGen.SchemaGenerator.GenerateObjectSchema(SerializerContract serializerContract, SchemaRepository schemaRepository)
at Swashbuckle.AspNetCore.SwaggerGen.SchemaGenerator.GenerateInlineSchema(SerializerContract serializerContract, SchemaRepository schemaRepository)
at Swashbuckle.AspNetCore.SwaggerGen.SchemaGenerator.<>c__DisplayClass6_0.<GenerateReferencedSchema>b__0()
at Swashbuckle.AspNetCore.SwaggerGen.SchemaRepository.GetOrAdd(Type type, String schemaId, Func`1 factoryMethod)
at Swashbuckle.AspNetCore.SwaggerGen.SchemaGenerator.GenerateReferencedSchema(SerializerContract serializerContract, SchemaRepository schemaRepository)
at Swashbuckle.AspNetCore.SwaggerGen.SchemaGenerator.GenerateSchemaForType(Type type, SchemaRepository schemaRepository)
at Swashbuckle.AspNetCore.SwaggerGen.SchemaGenerator.GenerateSchema(Type type, SchemaRepository schemaRepository, MemberInfo memberInfo, ParameterInfo parameterInfo)
at Swashbuckle.AspNetCore.SwaggerGen.SchemaGenerator.GenerateObjectSchema(SerializerContract serializerContract, SchemaRepository schemaRepository)
at Swashbuckle.AspNetCore.SwaggerGen.SchemaGenerator.GenerateInlineSchema(SerializerContract serializerContract, SchemaRepository schemaRepository)
at Swashbuckle.AspNetCore.SwaggerGen.SchemaGenerator.<>c__DisplayClass6_0.<GenerateReferencedSchema>b__0()
at Swashbuckle.AspNetCore.SwaggerGen.SchemaRepository.GetOrAdd(Type type, String schemaId, Func`1 factoryMethod)
at Swashbuckle.AspNetCore.SwaggerGen.SchemaGenerator.GenerateReferencedSchema(SerializerContract serializerContract, SchemaRepository schemaRepository)
at Swashbuckle.AspNetCore.SwaggerGen.SchemaGenerator.GenerateSchemaForType(Type type, SchemaRepository schemaRepository)
at Swashbuckle.AspNetCore.SwaggerGen.SchemaGenerator.GenerateSchema(Type type, SchemaRepository schemaRepository, MemberInfo memberInfo, ParameterInfo parameterInfo)
at Swashbuckle.AspNetCore.SwaggerGen.SchemaGenerator.GenerateObjectSchema(SerializerContract serializerContract, SchemaRepository schemaRepository)
at Swashbuckle.AspNetCore.SwaggerGen.SchemaGenerator.GenerateInlineSchema(SerializerContract serializerContract, SchemaRepository schemaRepository)
at Swashbuckle.AspNetCore.SwaggerGen.SchemaGenerator.<>c__DisplayClass6_0.<GenerateReferencedSchema>b__0()
at Swashbuckle.AspNetCore.SwaggerGen.SchemaRepository.GetOrAdd(Type type, String schemaId, Func`1 factoryMethod)
at Swashbuckle.AspNetCore.SwaggerGen.SchemaGenerator.GenerateReferencedSchema(SerializerContract serializerContract, SchemaRepository schemaRepository)
at Swashbuckle.AspNetCore.SwaggerGen.SchemaGenerator.GenerateSchemaForType(Type type, SchemaRepository schemaRepository)
at Swashbuckle.AspNetCore.SwaggerGen.SchemaGenerator.GenerateSchema(Type type, SchemaRepository schemaRepository, MemberInfo memberInfo, ParameterInfo parameterInfo)
at Swashbuckle.AspNetCore.SwaggerGen.SchemaGenerator.GenerateArraySchema(SerializerContract serializerContract, SchemaRepository schemaRepository)
at Swashbuckle.AspNetCore.SwaggerGen.SchemaGenerator.GenerateInlineSchema(SerializerContract serializerContract, SchemaRepository schemaRepository)
at Swashbuckle.AspNetCore.SwaggerGen.SchemaGenerator.GenerateSchemaForType(Type type, SchemaRepository schemaRepository)
at Swashbuckle.AspNetCore.SwaggerGen.SchemaGenerator.GenerateSchema(Type type, SchemaRepository schemaRepository, MemberInfo memberInfo, ParameterInfo parameterInfo)
at Swashbuckle.AspNetCore.SwaggerGen.SwaggerGenerator.GenerateRequestBodyFromBodyParameter(ApiDescription apiDescription, SchemaRepository schemaRepository, ApiParameterDescription bodyParameter)
at Swashbuckle.AspNetCore.SwaggerGen.SwaggerGenerator.GenerateRequestBody(ApiDescription apiDescription, SchemaRepository schemaRepository)
at Swashbuckle.AspNetCore.SwaggerGen.SwaggerGenerator.GenerateOperation(ApiDescription apiDescription, SchemaRepository schemaRepository)
at Swashbuckle.AspNetCore.SwaggerGen.SwaggerGenerator.GenerateOperations(IEnumerable`1 apiDescriptions, SchemaRepository schemaRepository)
at Swashbuckle.AspNetCore.SwaggerGen.SwaggerGenerator.GeneratePaths(IEnumerable`1 apiDescriptions, SchemaRepository schemaRepository)
at Swashbuckle.AspNetCore.SwaggerGen.SwaggerGenerator.GetSwagger(String documentName, String host, String basePath)
at Swashbuckle.AspNetCore.Swagger.SwaggerMiddleware.Invoke(HttpContext httpContext, ISwaggerProvider swaggerProvider)
at Swashbuckle.AspNetCore.SwaggerUI.SwaggerUIMiddleware.Invoke(HttpContext httpContext)
at Microsoft.AspNetCore.Authorization.AuthorizationMiddleware.Invoke(HttpContext context)
at Microsoft.AspNetCore.Authentication.AuthenticationMiddleware.Invoke(HttpContext context)
at Microsoft.AspNetCore.Builder.Extensions.MapMiddleware.Invoke(HttpContext context)
Fixed by using
services.AddSwaggerGen(options =>
{
options.CustomSchemaIds(type => type.ToString());
});
From issue #1431: https://github.com/domaindrivendev/Swashbuckle.AspNetCore/issues/1431#issuecomment-578418266
@domaindrivendev Not sure who the repo owner is but judging by the likes I'm not the only one with this issue. maybe it could get looked into?
By default, SB uses the short (unqualified name) which has its benefits because it keeps the docs simpler but also it’s downside if model names are duplicated in different namespaces. In this case, you can provide a custom naming strategy as described above.
That’s it! Not sure what else needs to be “looked into”. Are expecting SB to do something else out of the box? If so, please elaborate on proposed behavior?
@domaindrivendev 👋🏻
Not sure what else needs to be “looked into”.
Instead of a 'global' setting using options.CustomSchemaIds .. is it possible to set this via an _attribute_ on the Action Method?
something like:
// Details for a single user
[HttpGet("users/{userId}", Name = "Users_GetAUser")]
[ProducesResponseType(typeof(GetUser.Response), (int)HttpStatusCode.OK), Name = "Users_GetAUser"]
[ProducesResponseType((int)HttpStatusCode.NotFound)]
public async Task<IActionResult> GetUser([FromRoute] GetUser.Query request, CancellationToken cancellationToken)
{
...
}
// User index/search (query takes filter options)
[HttpGet("users/", Name = "Users_GetAUser")]
[ProducesResponseType(typeof(GetUsers.Response), (int)HttpStatusCode.OK), Name = "Users_GetUsers"]
public async Task<IActionResult> GetUsers([FromRoute] GetUsers.Query request, CancellationToken cancellationToken)
{
...
}
notice the Name = "Users_GetAUser" ? so we define the name of the response class, there.
Most helpful comment
Fixed by using
From issue #1431: https://github.com/domaindrivendev/Swashbuckle.AspNetCore/issues/1431#issuecomment-578418266