Skip to content

Add OpenAPI operation and schema transformer interfaces #56395

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
Merged
Show file tree
Hide file tree
Changes from 6 commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions AspNetCore.sln
Original file line number Diff line number Diff line change
Expand Up @@ -1788,7 +1788,7 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "NotReferencedInWasmCodePack
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Components.WasmRemoteAuthentication", "src\Components\test\testassets\Components.WasmRemoteAuthentication\Components.WasmRemoteAuthentication.csproj", "{8A021D6D-7935-4AB3-BB47-38D4FF9B0D13}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Sample", "src\OpenApi\sample\Sample.csproj", "{6DEC24A8-A166-432F-8E3B-58FFCDA92F52}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Sample", "src\OpenApi\sample\Sample.csproj", "{6DEC24A8-A166-432F-8E3B-58FFCDA92F52}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Hybrid", "Hybrid", "{2D64CA23-6E81-488E-A7D3-9BDF87240098}"
EndProject
Expand All @@ -1802,7 +1802,7 @@ Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.Extensions.Cachin
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "perf", "perf", "{9DC6B242-457B-4767-A84B-C3D23B76C642}"
EndProject
Project("{FAE04EC0-301F-11D3-BF4B-00C04F79EFBC}") = "Microsoft.AspNetCore.OpenApi.Microbenchmarks", "src\OpenApi\perf\Microbenchmarks\Microsoft.AspNetCore.OpenApi.Microbenchmarks.csproj", "{D53F0EF7-0CDC-49B4-AA2D-229901B0A734}"
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "Microsoft.AspNetCore.OpenApi.Microbenchmarks", "src\OpenApi\perf\Microbenchmarks\Microsoft.AspNetCore.OpenApi.Microbenchmarks.csproj", "{D53F0EF7-0CDC-49B4-AA2D-229901B0A734}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "KeyManagementSimulator", "src\DataProtection\samples\KeyManagementSimulator\KeyManagementSimulator.csproj", "{5B5F86CC-3598-463C-9F9B-F78FBB6642F4}"
EndProject
Expand Down
8 changes: 6 additions & 2 deletions src/OpenApi/OpenApi.slnf
Original file line number Diff line number Diff line change
Expand Up @@ -2,15 +2,19 @@
"solution": {
"path": "..\\..\\AspNetCore.sln",
"projects": [
"src\\Extensions\\Features\\src\\Microsoft.Extensions.Features.csproj",
"src\\Hosting\\Abstractions\\src\\Microsoft.AspNetCore.Hosting.Abstractions.csproj",
"src\\Hosting\\Hosting\\src\\Microsoft.AspNetCore.Hosting.csproj",
"src\\Http\\Headers\\src\\Microsoft.Net.Http.Headers.csproj",
"src\\Http\\Http.Abstractions\\src\\Microsoft.AspNetCore.Http.Abstractions.csproj",
"src\\Http\\Http\\src\\Microsoft.AspNetCore.Http.csproj",
"src\\Http\\Http.Features\\src\\Microsoft.AspNetCore.Http.Features.csproj",
"src\\Http\\Routing\\src\\Microsoft.AspNetCore.Routing.csproj",
"src\\OpenApi\\perf\\Microbenchmarks\\Microsoft.AspNetCore.OpenApi.Microbenchmarks.csproj",
"src\\OpenApi\\sample\\Sample.csproj",
"src\\OpenApi\\src\\Microsoft.AspNetCore.OpenApi.csproj",
"src\\OpenApi\\test\\Microsoft.AspNetCore.OpenApi.Tests.csproj",
"src\\OpenApi\\sample\\Sample.csproj",
"src\\OpenApi\\perf\\Microbenchmarks\\Microsoft.AspNetCore.OpenApi.Microbenchmarks.csproj"
"src\\Servers\\Connections.Abstractions\\src\\Microsoft.AspNetCore.Connections.Abstractions.csproj"
]
}
}
75 changes: 67 additions & 8 deletions src/OpenApi/perf/Microbenchmarks/TransformersBenchmark.cs
Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I haven't run these yet.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Having trouble running these locally. I've run restore.cmd, done . activate.ps1 and run eng\build.cmd, but trying to dotnet run these benchmarks I just get this:

dotnet run --configuration Release --framework net9.0
C:\Coding\dotnet\aspnetcore\src\Servers\IIS\IIS\src\Microsoft.AspNetCore.Server.IIS.csproj(41,5): error : Required dll from ANCM has not been built. To build ANCM, you must use MSBuild.exe.

The build failed. Fix the build errors and run again.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Ooof -- I usually develop on macOS/Linux so I don't run into the IIS-specific issues with the build. 😅

One thing I would check is if you have the C++ Components installed in Visual Studio. Then, perhaps try doing a build in the src/Servers directory?

I'll try running them locally as well to see what we can get here.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'll try running them from WSL on my laptop.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I'll have to try again another day - on WSL I'm getting issues from Node trying to build Blazor, which the build fails and complains about if it's not been produced.

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Welp -- I had written up this comment alongside my earlier review and then GitHub played me and didn't post it. Let me know if you are seeing similar numbers after making the change to the ActivatedTransformer scenarios.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

No problem! I’ll re-run them tomorrow and see what happens. For whatever reason they seem to take A While™️ to run on my little-laptop-that-could.

Copy link
Member Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Here's what I get in WSL with the latest changes:


BenchmarkDotNet=v0.13.0, OS=ubuntu 22.04
12th Gen Intel Core i7-1270P, 1 CPU, 16 logical and 8 physical cores
.NET SDK=9.0.100-preview.7.24358.6
  [Host]     : .NET 9.0.0 (9.0.24.35702), X64 RyuJIT
  Job-RWQJNC : .NET 9.0.0 (9.0.24.35702), X64 RyuJIT

Server=True  Toolchain=.NET Core 9.0  RunStrategy=Throughput  
Method TransformerCount Mean Error StdDev Median Op/s Gen 0 Gen 1 Gen 2 Allocated
ActivatedOperationTransformer 10 6.511 μs 0.2847 μs 0.8167 μs 6.520 μs 153,594.6 0.1755 0.0381 - 7 KB
OperationTransformerAsDelegate 10 5.382 μs 0.3163 μs 0.8871 μs 5.228 μs 185,804.4 0.0076 - - 6 KB
ActivatedDocumentTransformer 10 6.532 μs 0.3649 μs 1.0703 μs 6.324 μs 153,103.4 - - - 7 KB
DocumentTransformerAsDelegate 10 5.602 μs 0.2916 μs 0.8505 μs 5.667 μs 178,521.0 0.0076 - - 6 KB
ActivatedSchemaTransformer 10 71.136 μs 1.7172 μs 5.0093 μs 70.855 μs 14,057.7 1.4648 - - 56 KB
SchemaTransformerAsDelegate 10 76.440 μs 3.2091 μs 9.2590 μs 75.209 μs 13,082.1 1.4648 - - 55 KB
ActivatedOperationTransformer 100 10.824 μs 0.9000 μs 2.4789 μs 10.920 μs 92,389.4 0.2289 0.0458 - 9 KB
OperationTransformerAsDelegate 100 8.029 μs 0.4858 μs 1.3939 μs 7.804 μs 124,550.7 - - - 6 KB
ActivatedDocumentTransformer 100 9.658 μs 0.5128 μs 1.4712 μs 9.669 μs 103,541.0 0.2365 0.0534 - 9 KB
DocumentTransformerAsDelegate 100 7.948 μs 0.3417 μs 0.9694 μs 8.019 μs 125,824.2 - - - 6 KB
ActivatedSchemaTransformer 100 77.444 μs 1.7093 μs 5.0132 μs 77.709 μs 12,912.5 0.4883 - - 66 KB
SchemaTransformerAsDelegate 100 71.226 μs 1.7780 μs 5.2425 μs 71.005 μs 14,039.9 1.4648 - - 61 KB
ActivatedOperationTransformer 1000 69.732 μs 2.8724 μs 8.2875 μs 66.498 μs 14,340.7 0.7935 0.1831 - 30 KB
OperationTransformerAsDelegate 1000 16.873 μs 0.8374 μs 2.4691 μs 16.685 μs 59,267.5 - - - 6 KB
ActivatedDocumentTransformer 1000 66.275 μs 1.2815 μs 2.6750 μs 65.474 μs 15,088.7 0.7324 0.1221 - 30 KB
DocumentTransformerAsDelegate 1000 20.716 μs 1.2154 μs 3.5455 μs 19.535 μs 48,272.1 0.1526 0.0305 - 6 KB
ActivatedSchemaTransformer 1000 262.090 μs 8.0333 μs 23.4336 μs 257.450 μs 3,815.5 3.9063 - - 164 KB
SchemaTransformerAsDelegate 1000 146.933 μs 5.4175 μs 15.8032 μs 148.187 μs 6,805.8 0.9766 - - 117 KB

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Did another run on my end against 28acf62. The numbers were seeing have some variance but tell the same story about the cost of activation, particularly for schema transformers which get called more frequently in the pipeline.

Method TransformerCount Mean Error StdDev Op/s Gen 0 Gen 1 Gen 2 Allocated
ActivatedOperationTransformer 10 2.466 μs 0.0377 μs 0.0477 μs 405,514.3 0.0534 0.0114 - 7 KB
OperationTransformerAsDelegate 10 2.561 μs 0.0195 μs 0.0173 μs 390,494.5 0.0496 0.0114 - 6 KB
ActivatedDocumentTransformer 10 2.462 μs 0.0369 μs 0.0288 μs 406,209.9 0.0534 0.0114 - 7 KB
DocumentTransformerAsDelegate 10 2.399 μs 0.0463 μs 0.0455 μs 416,841.0 0.0496 0.0114 - 6 KB
ActivatedSchemaTransformer 10 31.617 μs 0.4569 μs 0.4274 μs 31,628.4 0.3662 - - 56 KB
SchemaTransformerAsDelegate 10 30.972 μs 0.6155 μs 0.6320 μs 32,287.4 0.3662 - - 55 KB
ActivatedOperationTransformer 100 4.082 μs 0.0557 μs 0.0494 μs 244,954.8 0.0687 0.0153 - 9 KB
OperationTransformerAsDelegate 100 3.250 μs 0.0595 μs 0.0497 μs 307,655.7 0.0458 0.0076 - 6 KB
ActivatedDocumentTransformer 100 4.149 μs 0.0428 μs 0.0358 μs 241,048.5 0.0687 0.0153 - 9 KB
DocumentTransformerAsDelegate 100 3.241 μs 0.0258 μs 0.0215 μs 308,574.1 0.0496 0.0114 - 6 KB
ActivatedSchemaTransformer 100 38.633 μs 0.2470 μs 0.2190 μs 25,884.8 0.4883 - - 66 KB
SchemaTransformerAsDelegate 100 35.940 μs 0.4064 μs 0.3802 μs 27,824.2 0.4883 - - 62 KB
ActivatedOperationTransformer 1000 34.187 μs 0.4856 μs 0.4543 μs 29,251.0 0.2441 - - 30 KB
OperationTransformerAsDelegate 1000 11.128 μs 0.0788 μs 0.0658 μs 89,863.8 0.0458 0.0153 - 6 KB
ActivatedDocumentTransformer 1000 36.648 μs 0.6589 μs 0.8332 μs 27,286.5 0.2441 - - 30 KB
DocumentTransformerAsDelegate 1000 12.282 μs 0.0807 μs 0.0674 μs 81,422.7 0.0458 0.0153 - 6 KB
ActivatedSchemaTransformer 1000 145.059 μs 1.1951 μs 0.9980 μs 6,893.7 1.2207 0.2441 - 164 KB
SchemaTransformerAsDelegate 1000 72.551 μs 0.4466 μs 0.3959 μs 13,783.4 0.7324 - - 117 KB

Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

See #56829.

Original file line number Diff line number Diff line change
Expand Up @@ -21,16 +21,27 @@ public class TransformersBenchmark : OpenApiDocumentServiceTestBase
public int TransformerCount { get; set; }

private readonly IEndpointRouteBuilder _builder = CreateBuilder();
private readonly OpenApiOptions _options = new OpenApiOptions();
private readonly OpenApiOptions _options = new();
private OpenApiDocumentService _documentService;

[GlobalSetup(Target = nameof(ActivatedOperationTransformer))]
public void ActivatedOperationTransformer_Setup()
{
_builder.MapGet("/", () => { });
for (var i = 0; i <= TransformerCount; i++)
{
_options.AddOperationTransformer<OperationTransformer>();
}
_documentService = CreateDocumentService(_builder, _options);
}

[GlobalSetup(Target = nameof(OperationTransformerAsDelegate))]
public void OperationTransformerAsDelegate_Setup()
{
_builder.MapGet("/", () => { });
for (var i = 0; i <= TransformerCount; i++)
{
_options.UseOperationTransformer((operation, context, token) =>
_options.AddOperationTransformer((operation, context, token) =>
{
operation.Description = "New Description";
return Task.CompletedTask;
Expand All @@ -45,7 +56,7 @@ public void ActivatedDocumentTransformer_Setup()
_builder.MapGet("/", () => { });
for (var i = 0; i <= TransformerCount; i++)
{
_options.UseTransformer<ActivatedTransformer>();
_options.AddDocumentTransformer<DocumentTransformer>();
}
_documentService = CreateDocumentService(_builder, _options);
}
Expand All @@ -56,7 +67,7 @@ public void DocumentTransformerAsDelegate_Delegate()
_builder.MapGet("/", () => { });
for (var i = 0; i <= TransformerCount; i++)
{
_options.UseTransformer((document, context, token) =>
_options.AddDocumentTransformer((document, context, token) =>
{
document.Info.Description = "New Description";
return Task.CompletedTask;
Expand All @@ -65,13 +76,24 @@ public void DocumentTransformerAsDelegate_Delegate()
_documentService = CreateDocumentService(_builder, _options);
}

[GlobalSetup(Target = nameof(SchemaTransformer))]
[GlobalSetup(Target = nameof(ActivatedSchemaTransformer))]
public void ActivatedSchemaTransformer_Setup()
{
_builder.MapGet("/", () => { });
for (var i = 0; i <= TransformerCount; i++)
{
_options.AddSchemaTransformer<SchemaTransformer>();
}
_documentService = CreateDocumentService(_builder, _options);
}

[GlobalSetup(Target = nameof(SchemaTransformerAsDelegate))]
public void SchemaTransformer_Setup()
{
_builder.MapPost("/", (Todo todo) => todo);
for (var i = 0; i <= TransformerCount; i++)
{
_options.UseSchemaTransformer((schema, context, token) =>
_options.AddSchemaTransformer((schema, context, token) =>
{
if (context.Type == typeof(Todo) && context.ParameterDescription != null)
{
Expand All @@ -87,6 +109,12 @@ public void SchemaTransformer_Setup()
_documentService = CreateDocumentService(_builder, _options);
}

[Benchmark]
public async Task ActivatedOperationTransformer()
{
await _documentService.GetOpenApiDocumentAsync();
}

[Benchmark]
public async Task OperationTransformerAsDelegate()
{
Expand All @@ -106,17 +134,48 @@ public async Task DocumentTransformerAsDelegate()
}

[Benchmark]
public async Task SchemaTransformer()
public async Task ActivatedSchemaTransformer()
{
await _documentService.GetOpenApiDocumentAsync();
}

[Benchmark]
public async Task SchemaTransformerAsDelegate()
{
await _documentService.GetOpenApiDocumentAsync();
}

private class ActivatedTransformer : IOpenApiDocumentTransformer
private class DocumentTransformer : IOpenApiDocumentTransformer
{
public Task TransformAsync(OpenApiDocument document, OpenApiDocumentTransformerContext context, CancellationToken cancellationToken)
{
document.Info.Description = "Info Description";
return Task.CompletedTask;
}
}

private class OperationTransformer : IOpenApiOperationTransformer
{
public Task TransformAsync(OpenApiOperation operation, OpenApiOperationTransformerContext context, CancellationToken cancellationToken)
{
operation.Description = "Operation Description";
return Task.CompletedTask;
}
}

private class SchemaTransformer : IOpenApiSchemaTransformer
{
public Task TransformAsync(OpenApiSchema schema, OpenApiSchemaTransformerContext context, CancellationToken cancellationToken)
{
if (context.Type == typeof(Todo) && context.ParameterDescription != null)
{
schema.Extensions["x-my-extension"] = new OpenApiString(context.ParameterDescription.Name);
}
else
{
schema.Extensions["x-my-extension"] = new OpenApiString("response");
}
return Task.CompletedTask;
}
}
}
12 changes: 7 additions & 5 deletions src/OpenApi/sample/Program.cs
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

using System.Collections.Frozen;
using System.Collections.Immutable;
using System.ComponentModel;
using Microsoft.AspNetCore.Http.HttpResults;
Expand All @@ -19,11 +18,13 @@
builder.Services.AddOpenApi("v1", options =>
{
options.AddHeader("X-Version", "1.0");
options.UseTransformer<BearerSecuritySchemeTransformer>();
options.AddDocumentTransformer<BearerSecuritySchemeTransformer>();
});
builder.Services.AddOpenApi("v2", options => {
options.UseTransformer(new AddContactTransformer());
options.UseTransformer((document, context, token) => {
options.AddSchemaTransformer<AddExternalDocsTransformer>();
options.AddOperationTransformer<AddExternalDocsTransformer>();
options.AddDocumentTransformer(new AddContactTransformer());
options.AddDocumentTransformer((document, context, token) => {
document.Info.License = new OpenApiLicense { Name = "MIT" };
return Task.CompletedTask;
});
Expand Down Expand Up @@ -82,7 +83,8 @@
v2.MapGet("/users", () => new [] { "alice", "bob" })
.WithTags("users");

v2.MapPost("/users", () => Results.Created("/users/1", new { Id = 1, Name = "Test user" }));
v2.MapPost("/users", () => Results.Created("/users/1", new { Id = 1, Name = "Test user" }))
.WithName("CreateUser");

responses.MapGet("/200-add-xml", () => new TodoWithDueDate(1, "Test todo", false, DateTime.Now.AddDays(1), DateTime.Now))
.Produces<Todo>(additionalContentTypes: "text/xml");
Expand Down
42 changes: 42 additions & 0 deletions src/OpenApi/sample/Transformers/AddExternalDocsTransformer.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
// Licensed to the .NET Foundation under one or more agreements.
// The .NET Foundation licenses this file to you under the MIT license.

using Microsoft.AspNetCore.OpenApi;
using Microsoft.OpenApi.Models;

namespace Sample.Transformers;

public sealed class AddExternalDocsTransformer(IConfiguration configuration) : IOpenApiOperationTransformer, IOpenApiSchemaTransformer
{
public Task TransformAsync(OpenApiOperation operation, OpenApiOperationTransformerContext context, CancellationToken cancellationToken)
{
if (operation.OperationId is { Length: > 0 } id &&
Uri.TryCreate(configuration["DocumentationBaseUrl"], UriKind.Absolute, out var baseUri))
{
var url = new Uri(baseUri, $"/api/docs/operations/{Uri.EscapeDataString(id)}");

operation.ExternalDocs = new OpenApiExternalDocs
{
Description = "Documentation for this OpenAPI endpoint",
Url = url
};
}

return Task.CompletedTask;
}

public Task TransformAsync(OpenApiSchema schema, OpenApiSchemaTransformerContext context, CancellationToken cancellationToken)
{
if (Uri.TryCreate(configuration["DocumentationBaseUrl"], UriKind.Absolute, out var baseUri))
{
var url = new Uri(baseUri, $"/api/docs/schemas/{Uri.EscapeDataString(schema.Type)}");

schema.ExternalDocs = new OpenApiExternalDocs
{
Description = "Documentation for this OpenAPI schema",
Url = url
};
}
return Task.CompletedTask;
}
}
4 changes: 2 additions & 2 deletions src/OpenApi/sample/Transformers/OperationTransformers.cs
Original file line number Diff line number Diff line change
Expand Up @@ -2,17 +2,17 @@
// The .NET Foundation licenses this file to you under the MIT license.

using Microsoft.AspNetCore.OpenApi;
using Microsoft.OpenApi.Models;
using Microsoft.OpenApi.Any;
using Microsoft.OpenApi.Extensions;
using Microsoft.OpenApi.Models;

namespace Sample.Transformers;

public static class OperationTransformers
{
public static OpenApiOptions AddHeader(this OpenApiOptions options, string headerName, string defaultValue)
{
return options.UseOperationTransformer((operation, context, cancellationToken) =>
return options.AddOperationTransformer((operation, context, cancellationToken) =>
{
var schema = OpenApiTypeMapper.MapTypeToOpenApiPrimitiveType(typeof(string));
schema.Default = new OpenApiString(defaultValue);
Expand Down
1 change: 1 addition & 0 deletions src/OpenApi/sample/appsettings.json
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
{
"DocumentationBaseUrl": "https://example.com",
"Logging": {
"LogLevel": {
"Default": "Information",
Expand Down
18 changes: 13 additions & 5 deletions src/OpenApi/src/PublicAPI.Unshipped.txt
Original file line number Diff line number Diff line change
@@ -1,9 +1,17 @@
#nullable enable
Microsoft.AspNetCore.Builder.OpenApiEndpointRouteBuilderExtensions
Microsoft.AspNetCore.OpenApi.IOpenApiDocumentTransformer.TransformAsync(Microsoft.OpenApi.Models.OpenApiDocument! document, Microsoft.AspNetCore.OpenApi.OpenApiDocumentTransformerContext! context, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task!
Microsoft.AspNetCore.OpenApi.IOpenApiOperationTransformer
Microsoft.AspNetCore.OpenApi.IOpenApiOperationTransformer.TransformAsync(Microsoft.OpenApi.Models.OpenApiOperation! operation, Microsoft.AspNetCore.OpenApi.OpenApiOperationTransformerContext! context, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task!
Microsoft.AspNetCore.OpenApi.IOpenApiSchemaTransformer
Microsoft.AspNetCore.OpenApi.IOpenApiSchemaTransformer.TransformAsync(Microsoft.OpenApi.Models.OpenApiSchema! schema, Microsoft.AspNetCore.OpenApi.OpenApiSchemaTransformerContext! context, System.Threading.CancellationToken cancellationToken) -> System.Threading.Tasks.Task!
Microsoft.AspNetCore.OpenApi.OpenApiOperationTransformerContext.Description.get -> Microsoft.AspNetCore.Mvc.ApiExplorer.ApiDescription!
Microsoft.AspNetCore.OpenApi.OpenApiOperationTransformerContext.Description.init -> void
Microsoft.AspNetCore.OpenApi.OpenApiOptions
Microsoft.AspNetCore.OpenApi.OpenApiOptions.AddOperationTransformer(Microsoft.AspNetCore.OpenApi.IOpenApiOperationTransformer! transformer) -> Microsoft.AspNetCore.OpenApi.OpenApiOptions!
Microsoft.AspNetCore.OpenApi.OpenApiOptions.AddOperationTransformer<TTransformerType>() -> Microsoft.AspNetCore.OpenApi.OpenApiOptions!
Microsoft.AspNetCore.OpenApi.OpenApiOptions.AddSchemaTransformer(Microsoft.AspNetCore.OpenApi.IOpenApiSchemaTransformer! transformer) -> Microsoft.AspNetCore.OpenApi.OpenApiOptions!
Microsoft.AspNetCore.OpenApi.OpenApiOptions.AddSchemaTransformer<TTransformerType>() -> Microsoft.AspNetCore.OpenApi.OpenApiOptions!
Microsoft.AspNetCore.OpenApi.OpenApiOptions.CreateSchemaReferenceId.get -> System.Func<System.Text.Json.Serialization.Metadata.JsonTypeInfo!, string?>!
Microsoft.AspNetCore.OpenApi.OpenApiOptions.CreateSchemaReferenceId.set -> void
Microsoft.AspNetCore.OpenApi.OpenApiOptions.DocumentName.get -> string!
Expand All @@ -12,11 +20,11 @@ Microsoft.AspNetCore.OpenApi.OpenApiOptions.OpenApiVersion.get -> Microsoft.Open
Microsoft.AspNetCore.OpenApi.OpenApiOptions.OpenApiVersion.set -> void
Microsoft.AspNetCore.OpenApi.OpenApiOptions.ShouldInclude.get -> System.Func<Microsoft.AspNetCore.Mvc.ApiExplorer.ApiDescription!, bool>!
Microsoft.AspNetCore.OpenApi.OpenApiOptions.ShouldInclude.set -> void
Microsoft.AspNetCore.OpenApi.OpenApiOptions.UseOperationTransformer(System.Func<Microsoft.OpenApi.Models.OpenApiOperation!, Microsoft.AspNetCore.OpenApi.OpenApiOperationTransformerContext!, System.Threading.CancellationToken, System.Threading.Tasks.Task!>! transformer) -> Microsoft.AspNetCore.OpenApi.OpenApiOptions!
Microsoft.AspNetCore.OpenApi.OpenApiOptions.UseSchemaTransformer(System.Func<Microsoft.OpenApi.Models.OpenApiSchema!, Microsoft.AspNetCore.OpenApi.OpenApiSchemaTransformerContext!, System.Threading.CancellationToken, System.Threading.Tasks.Task!>! transformer) -> Microsoft.AspNetCore.OpenApi.OpenApiOptions!
Microsoft.AspNetCore.OpenApi.OpenApiOptions.UseTransformer(Microsoft.AspNetCore.OpenApi.IOpenApiDocumentTransformer! transformer) -> Microsoft.AspNetCore.OpenApi.OpenApiOptions!
Microsoft.AspNetCore.OpenApi.OpenApiOptions.UseTransformer(System.Func<Microsoft.OpenApi.Models.OpenApiDocument!, Microsoft.AspNetCore.OpenApi.OpenApiDocumentTransformerContext!, System.Threading.CancellationToken, System.Threading.Tasks.Task!>! transformer) -> Microsoft.AspNetCore.OpenApi.OpenApiOptions!
Microsoft.AspNetCore.OpenApi.OpenApiOptions.UseTransformer<TTransformerType>() -> Microsoft.AspNetCore.OpenApi.OpenApiOptions!
Microsoft.AspNetCore.OpenApi.OpenApiOptions.AddOperationTransformer(System.Func<Microsoft.OpenApi.Models.OpenApiOperation!, Microsoft.AspNetCore.OpenApi.OpenApiOperationTransformerContext!, System.Threading.CancellationToken, System.Threading.Tasks.Task!>! transformer) -> Microsoft.AspNetCore.OpenApi.OpenApiOptions!
Microsoft.AspNetCore.OpenApi.OpenApiOptions.AddSchemaTransformer(System.Func<Microsoft.OpenApi.Models.OpenApiSchema!, Microsoft.AspNetCore.OpenApi.OpenApiSchemaTransformerContext!, System.Threading.CancellationToken, System.Threading.Tasks.Task!>! transformer) -> Microsoft.AspNetCore.OpenApi.OpenApiOptions!
Microsoft.AspNetCore.OpenApi.OpenApiOptions.AddDocumentTransformer(Microsoft.AspNetCore.OpenApi.IOpenApiDocumentTransformer! transformer) -> Microsoft.AspNetCore.OpenApi.OpenApiOptions!
Microsoft.AspNetCore.OpenApi.OpenApiOptions.AddDocumentTransformer(System.Func<Microsoft.OpenApi.Models.OpenApiDocument!, Microsoft.AspNetCore.OpenApi.OpenApiDocumentTransformerContext!, System.Threading.CancellationToken, System.Threading.Tasks.Task!>! transformer) -> Microsoft.AspNetCore.OpenApi.OpenApiOptions!
Microsoft.AspNetCore.OpenApi.OpenApiOptions.AddDocumentTransformer<TTransformerType>() -> Microsoft.AspNetCore.OpenApi.OpenApiOptions!
Microsoft.AspNetCore.OpenApi.OpenApiSchemaTransformerContext
Microsoft.AspNetCore.OpenApi.OpenApiSchemaTransformerContext.ApplicationServices.get -> System.IServiceProvider!
Microsoft.AspNetCore.OpenApi.OpenApiSchemaTransformerContext.ApplicationServices.init -> void
Expand Down
Loading
Loading