Skip to content

Commit 5a39450

Browse files
committed
Fix handling for ambient route parameters
1 parent 870eec2 commit 5a39450

File tree

2 files changed

+26
-1
lines changed

2 files changed

+26
-1
lines changed

src/OpenApi/src/Services/Schemas/OpenApiSchemaService.cs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -126,8 +126,15 @@ internal sealed class OpenApiSchemaService(
126126
}
127127
};
128128

129-
internal async Task<OpenApiSchema> GetOrCreateSchemaAsync(Type type, IServiceProvider scopedServiceProvider, IOpenApiSchemaTransformer[] schemaTransformers, ApiParameterDescription? parameterDescription = null, bool captureSchemaByRef = false, CancellationToken cancellationToken = default)
129+
internal async Task<OpenApiSchema> GetOrCreateSchemaAsync(Type? type, IServiceProvider scopedServiceProvider, IOpenApiSchemaTransformer[] schemaTransformers, ApiParameterDescription? parameterDescription = null, bool captureSchemaByRef = false, CancellationToken cancellationToken = default)
130130
{
131+
// If the type is null, then we're dealing with an ambient
132+
// route parameter that does not define a specific parameter type in the
133+
// route handler or in the response. In this case, we default to a string schema.
134+
if (type is null)
135+
{
136+
return new OpenApiSchema { Type = "string" };
137+
}
131138
var key = parameterDescription?.ParameterDescriptor is IParameterInfoParameterDescriptor parameterInfoDescription
132139
&& parameterDescription.ModelMetadata.PropertyName is null
133140
? new OpenApiSchemaKey(type, parameterInfoDescription.ParameterInfo) : new OpenApiSchemaKey(type, null);

src/OpenApi/test/Microsoft.AspNetCore.OpenApi.Tests/Services/OpenApiSchemaService/OpenApiSchemaService.ParameterSchemas.cs

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -592,4 +592,22 @@ internal enum ItemStatus
592592
Approved = 1,
593593
Rejected = 2,
594594
}
595+
596+
[Fact]
597+
public async Task SupportsMvcActionWithAmbientRouteParameter()
598+
{
599+
// Arrange
600+
var action = CreateActionDescriptor(nameof(AmbientRouteParameter));
601+
602+
// Assert
603+
await VerifyOpenApiDocument(action, document =>
604+
{
605+
var operation = document.Paths["/api/with-ambient-route-param/{versionId}"].Operations[OperationType.Get];
606+
var parameter = Assert.Single(operation.Parameters);
607+
Assert.Equal("string", parameter.Schema.Type);
608+
});
609+
}
610+
611+
[Route("/api/with-ambient-route-param/{versionId}")]
612+
private void AmbientRouteParameter() { }
595613
}

0 commit comments

Comments
 (0)