Skip to content

InvalidOperationException when create schema on transformer #1227

Open

Description

@CoreDX9

Is there an existing issue for this?

  • I have searched the existing issues

Describe the bug

Microsoft open api will throw InvalidOperationException when create schema on transformer.

Asp.Versioning.OpenApi 10.2.3

Expected Behavior

Creation schema works.

Steps To Reproduce

just run:

using Asp.Versioning;
using Microsoft.AspNetCore.OpenApi;
using Microsoft.OpenApi;

var builder = WebApplication.CreateBuilder(args);

builder.Services
    .AddApiVersioning(static options =>
    {
        options.DefaultApiVersion = new ApiVersion(1, 0);
        options.ApiVersionReader = ApiVersionReader.Combine(
            new QueryStringApiVersionReader(),
            new HeaderApiVersionReader() { HeaderNames = { "x-api-version" } });
    })
    .AddApiExplorer(static options =>
    {
        options.GroupNameFormat = "'v'VVV";
        options.AssumeDefaultVersionWhenUnspecified = true;
    })
    .AddOpenApi(static options =>
    {
        var apiOptions = options.Document;

        apiOptions.AddOperationTransformer<AddSchemaBugOperationTransformer>();
    });

var app = builder.Build();

app.MapOpenApi().WithDocumentPerVersion();

var versionedApi = app.NewVersionedApi();

versionedApi.MapGet("/v1", () => "Hello from File-Based Web App! v1").HasApiVersion(new ApiVersion(1, 0));
versionedApi.MapGet("/v2", () => "Hello from File-Based Web App! v2").HasApiVersion(new ApiVersion(2, 0));

await app.RunAsync();

public class AddSchemaBugOperationTransformer : IOpenApiOperationTransformer
{
    public async Task TransformAsync(OpenApiOperation operation, OpenApiOperationTransformerContext context, CancellationToken cancellationToken)
    {
        var schema = await context.GetOrCreateSchemaAsync(typeof(Model), cancellationToken: cancellationToken).ConfigureAwait(false);
    }
}

public class Model
{
    public string Name { get; set; }
}

Exceptions (if any)

   在 Microsoft.Extensions.DependencyInjection.ServiceLookup.ThrowHelper.ThrowInvalidOperationException_NoKeyedServiceRegistered(Type serviceType, Type keyType)
   在 Microsoft.Extensions.DependencyInjection.ServiceProvider.GetRequiredKeyedService(Type serviceType, Object serviceKey, ServiceProviderEngineScope serviceProviderEngineScope)
   在 Microsoft.Extensions.DependencyInjection.ServiceProviderKeyedServiceExtensions.GetRequiredKeyedService[T](IServiceProvider provider, Object serviceKey)
   在 Microsoft.AspNetCore.OpenApi.OpenApiOperationTransformerContext.GetOrCreateSchemaAsync(Type type, ApiParameterDescription parameterDescription, CancellationToken cancellationToken)
   在 AddSchemaBugOperationTransformer.<TransformAsync>d__0.MoveNext() 在 D:\FileCSharp\VerApiBug\BugMin\BugMin.cs 中: 第 51 行
   在 Microsoft.AspNetCore.OpenApi.OpenApiDocumentService.<GetOperationsAsync>d__21.MoveNext()
   在 Microsoft.AspNetCore.OpenApi.OpenApiDocumentService.<GetOpenApiPathsAsync>d__20.MoveNext()
   在 Microsoft.AspNetCore.OpenApi.OpenApiDocumentService.<GetOpenApiDocumentAsync>d__12.MoveNext()
   在 Microsoft.Extensions.ApiDescriptions.OpenApiDocumentProvider.<GenerateAsync>d__3.MoveNext()
   在 Microsoft.Extensions.ApiDescriptions.OpenApiDocumentProvider.<GenerateAsync>d__2.MoveNext()
   在 Microsoft.WebTools.ApiEndpointDiscovery.OpenApiDocumentGenerator.<WriteOpenApiDocumentAsync>d__16.MoveNext()
   在 Microsoft.WebTools.ApiEndpointDiscovery.OpenApiDocumentGenerator.<GenerateOpenApiDocumentsAsync>d__15.MoveNext()

.NET Version

10.0.401

Anything else?

No response

Activity

  1. achikhv commented on Oct 15, 2026

    @achikhv

    Same exception when GetOrCreateSchemaAsync is called from wihtin DocumentTransformer.

    I can reproduce it with this minimal example

    using Asp.Versioning;
    using Microsoft.AspNetCore.Mvc;
    
    var builder = WebApplication.CreateBuilder(args);
    
    builder.Services.AddApiVersioning()
    .AddApiExplorer(options =>
    {
        options.GroupNameFormat = "'v'VVV";
    })
    .AddOpenApi(options =>
    {
        options.Document.AddDocumentTransformer(async (document, context, token) =>
        {
            var schema = await context.GetOrCreateSchemaAsync(typeof(CustomSchemaClass), cancellationToken: token);
    
            document.AddComponent(typeof(CustomSchemaClass).Name, schema);
        });
    });
    
    builder.Services.AddControllers();
    
    
    var app = builder.Build();
    
    app.MapOpenApi().WithDocumentPerVersion();
    
    app.MapControllers();
    
    app.Run();
    
    public class CustomSchemaClass
    {
    }
    
    [ApiController]
    [Route("api/v{version:apiVersion}/[controller]")]
    [ApiVersion("0.1")]
    [ApiVersion("1")]
    public class TestController : ControllerBase
    {
        [HttpGet]
        public void Get()
        {
        }
    }

    System.InvalidOperationException
    HResult=0x80131509
    Message=No keyed service for type 'Microsoft.AspNetCore.OpenApi.OpenApiSchemaService' using key type 'System.String' has been registered.
    Source=Microsoft.Extensions.DependencyInjection
    StackTrace:
    at Microsoft.Extensions.DependencyInjection.ServiceLookup.ThrowHelper.ThrowInvalidOperationException_NoKeyedServiceRegistered(Type serviceType, Type keyType)
    at Microsoft.Extensions.DependencyInjection.ServiceProvider.GetRequiredKeyedService(Type serviceType, Object serviceKey, ServiceProviderEngineScope serviceProviderEngineScope)
    at Microsoft.Extensions.DependencyInjection.ServiceProviderKeyedServiceExtensions.GetRequiredKeyedService[T](IServiceProvider provider, Object serviceKey)
    at Microsoft.AspNetCore.OpenApi.OpenApiDocumentTransformerContext.GetOrCreateSchemaAsync(Type type, ApiParameterDescription parameterDescription, CancellationToken cancellationToken)
    at Program.<>c.<<

    $>b__0_2>d.MoveNext() in C:\Users\chichkov\source\repos\WebApplication1\WebApplication1\Program.cs:line 15
    at Microsoft.AspNetCore.OpenApi.DelegateOpenApiDocumentTransformer.d__4.MoveNext()
    at Microsoft.AspNetCore.OpenApi.OpenApiDocumentService.d__13.MoveNext()
    at Microsoft.AspNetCore.OpenApi.OpenApiDocumentService.d__12.MoveNext()

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Type

No type

Projects

No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions