@@ -259,7 +259,7 @@ private static void GenerateDefaultResponses(Dictionary<int, (Type?, MediaTypeCo
259
259
var parameters = PropertyAsParameterInfo . Flatten ( methodInfo . GetParameters ( ) , ParameterBindingMethodCache ) ;
260
260
foreach ( var parameter in parameters )
261
261
{
262
- var ( bodyOrFormParameter , _) = GetOpenApiParameterLocation ( parameter , pattern , false ) ;
262
+ var ( bodyOrFormParameter , _, _ ) = GetOpenApiParameterLocation ( parameter , pattern , false ) ;
263
263
hasFormOrBodyParameter |= bodyOrFormParameter ;
264
264
if ( hasFormOrBodyParameter )
265
265
{
@@ -368,7 +368,7 @@ private List<OpenApiParameter> GetOpenApiParameters(MethodInfo methodInfo, Route
368
368
throw new InvalidOperationException ( $ "Encountered a parameter of type '{ parameter . ParameterType } ' without a name. Parameters must have a name.") ;
369
369
}
370
370
371
- var ( _, parameterLocation ) = GetOpenApiParameterLocation ( parameter , pattern , disableInferredBody ) ;
371
+ var ( _, parameterLocation , attributeName ) = GetOpenApiParameterLocation ( parameter , pattern , disableInferredBody ) ;
372
372
373
373
// if the parameter doesn't have a valid location
374
374
// then we should ignore it
@@ -379,7 +379,7 @@ private List<OpenApiParameter> GetOpenApiParameters(MethodInfo methodInfo, Route
379
379
var nullabilityContext = new NullabilityInfoContext ( ) ;
380
380
var nullability = nullabilityContext . Create ( parameter ) ;
381
381
var isOptional = parameter . HasDefaultValue || nullability . ReadState != NullabilityState . NotNull ;
382
- var name = pattern . GetParameter ( parameter . Name ) is { } routeParameter ? routeParameter . Name : parameter . Name ;
382
+ var name = attributeName ?? ( pattern . GetParameter ( parameter . Name ) is { } routeParameter ? routeParameter . Name : parameter . Name ) ;
383
383
var openApiParameter = new OpenApiParameter ( )
384
384
{
385
385
Name = name ,
@@ -393,29 +393,29 @@ private List<OpenApiParameter> GetOpenApiParameters(MethodInfo methodInfo, Route
393
393
return openApiParameters ;
394
394
}
395
395
396
- private ( bool isBodyOrForm , ParameterLocation ? locatedIn ) GetOpenApiParameterLocation ( ParameterInfo parameter , RoutePattern pattern , bool disableInferredBody )
396
+ private ( bool isBodyOrForm , ParameterLocation ? locatedIn , string ? name ) GetOpenApiParameterLocation ( ParameterInfo parameter , RoutePattern pattern , bool disableInferredBody )
397
397
{
398
398
var attributes = parameter . GetCustomAttributes ( ) ;
399
399
400
400
if ( attributes . OfType < IFromRouteMetadata > ( ) . FirstOrDefault ( ) is { } routeAttribute )
401
401
{
402
- return ( false , ParameterLocation . Path ) ;
402
+ return ( false , ParameterLocation . Path , routeAttribute . Name ) ;
403
403
}
404
404
else if ( attributes . OfType < IFromQueryMetadata > ( ) . FirstOrDefault ( ) is { } queryAttribute )
405
405
{
406
- return ( false , ParameterLocation . Query ) ;
406
+ return ( false , ParameterLocation . Query , queryAttribute . Name ) ;
407
407
}
408
408
else if ( attributes . OfType < IFromHeaderMetadata > ( ) . FirstOrDefault ( ) is { } headerAttribute )
409
409
{
410
- return ( false , ParameterLocation . Header ) ;
410
+ return ( false , ParameterLocation . Header , headerAttribute . Name ) ;
411
411
}
412
412
else if ( attributes . OfType < IFromBodyMetadata > ( ) . FirstOrDefault ( ) is { } fromBodyAttribute )
413
413
{
414
- return ( true , null ) ;
414
+ return ( true , null , null ) ;
415
415
}
416
416
else if ( attributes . OfType < IFromFormMetadata > ( ) . FirstOrDefault ( ) is { } fromFormAttribute )
417
417
{
418
- return ( true , null ) ;
418
+ return ( true , null , null ) ;
419
419
}
420
420
else if ( parameter . CustomAttributes . Any ( a => typeof ( IFromServiceMetadata ) . IsAssignableFrom ( a . AttributeType ) ) ||
421
421
parameter . ParameterType == typeof ( HttpContext ) ||
@@ -426,34 +426,34 @@ private List<OpenApiParameter> GetOpenApiParameters(MethodInfo methodInfo, Route
426
426
ParameterBindingMethodCache . HasBindAsyncMethod ( parameter ) ||
427
427
_serviceProviderIsService ? . IsService ( parameter . ParameterType ) == true )
428
428
{
429
- return ( false , null ) ;
429
+ return ( false , null , null ) ;
430
430
}
431
431
else if ( parameter . ParameterType == typeof ( string ) || ParameterBindingMethodCache . HasTryParseMethod ( parameter . ParameterType ) )
432
432
{
433
433
// Path vs query cannot be determined by RequestDelegateFactory at startup currently because of the layering, but can be done here.
434
434
if ( parameter . Name is { } name && pattern . GetParameter ( name ) is not null )
435
435
{
436
- return ( false , ParameterLocation . Path ) ;
436
+ return ( false , ParameterLocation . Path , null ) ;
437
437
}
438
438
else
439
439
{
440
- return ( false , ParameterLocation . Query ) ;
440
+ return ( false , ParameterLocation . Query , null ) ;
441
441
}
442
442
}
443
443
else if ( parameter . ParameterType == typeof ( IFormFile ) || parameter . ParameterType == typeof ( IFormFileCollection ) )
444
444
{
445
- return ( true , null ) ;
445
+ return ( true , null , null ) ;
446
446
}
447
447
else if ( disableInferredBody && (
448
448
( parameter . ParameterType . IsArray && ParameterBindingMethodCache . HasTryParseMethod ( parameter . ParameterType . GetElementType ( ) ! ) ) ||
449
449
parameter . ParameterType == typeof ( string [ ] ) ||
450
450
parameter . ParameterType == typeof ( StringValues ) ) )
451
451
{
452
- return ( false , ParameterLocation . Query ) ;
452
+ return ( false , ParameterLocation . Query , null ) ;
453
453
}
454
454
else
455
455
{
456
- return ( true , null ) ;
456
+ return ( true , null , null ) ;
457
457
}
458
458
}
459
459
}
0 commit comments