Skip to content

Commit 678e1e3

Browse files
Chris Martinezcommonsensesoftware
Chris Martinez
authored andcommitted
Configure container for unversioned route. Fixed #553
1 parent 604d84f commit 678e1e3

File tree

3 files changed

+28
-9
lines changed

3 files changed

+28
-9
lines changed

ApiVersioning.sln

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -357,4 +357,4 @@ Global
357357
GlobalSection(ExtensibilityGlobals) = postSolution
358358
SolutionGuid = {5A38B7FA-17BC-4D3C-977F-7379653DC67C}
359359
EndGlobalSection
360-
EndGlobal
360+
EndGlobal

src/Microsoft.AspNetCore.OData.Versioning/AspNet.OData/Extensions/IRouteBuilderExtensions.cs

Lines changed: 24 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -127,7 +127,13 @@ IEnumerable<IODataRoutingConvention> ConfigureRoutingConventions( IEdmModel mode
127127
routeCollection.Add( new ODataRouteMapping( route, apiVersion, rootContainer ) );
128128
}
129129

130-
builder.AddRouteToRespondWithBadRequestWhenAtLeastOneRouteCouldMatch( routeName, routePrefix, unversionedConstraints, inlineConstraintResolver );
130+
builder.AddRouteToRespondWithBadRequestWhenAtLeastOneRouteCouldMatch(
131+
routeName,
132+
routePrefix,
133+
unversionedConstraints,
134+
inlineConstraintResolver,
135+
builder.ConfigureDefaultServices( container => configureAction?.Invoke( container ) ) );
136+
131137
NotifyRoutesMapped();
132138

133139
return odataRoutes;
@@ -278,7 +284,13 @@ IEnumerable<IODataRoutingConvention> NewRouteConventions( IServiceProvider servi
278284
routeCollection.Add( new ODataRouteMapping( route, apiVersion, rootContainer ) );
279285
}
280286

281-
builder.AddRouteToRespondWithBadRequestWhenAtLeastOneRouteCouldMatch( routeName, routePrefix, unversionedConstraints, inlineConstraintResolver );
287+
builder.AddRouteToRespondWithBadRequestWhenAtLeastOneRouteCouldMatch(
288+
routeName,
289+
routePrefix,
290+
unversionedConstraints,
291+
inlineConstraintResolver,
292+
builder.ConfigureDefaultServices( _ => { } ) );
293+
282294
NotifyRoutesMapped();
283295

284296
return odataRoutes;
@@ -340,13 +352,13 @@ IEnumerable<IODataRoutingConvention> NewRoutingConventions( IServiceProvider ser
340352
var routeCollection = builder.ServiceProvider.GetRequiredService<IODataRouteCollectionProvider>();
341353
var perRouteContainer = builder.ServiceProvider.GetRequiredService<IPerRouteContainer>();
342354
var inlineConstraintResolver = builder.ServiceProvider.GetRequiredService<IInlineConstraintResolver>();
343-
var preConfigureAction = builder.ConfigureDefaultServices(
355+
var perConfigureAction = builder.ConfigureDefaultServices(
344356
container =>
345357
{
346358
container.AddService( Singleton, typeof( IEnumerable<IODataRoutingConvention> ), NewRoutingConventions );
347359
configureAction?.Invoke( container );
348360
} );
349-
var rootContainer = perRouteContainer.CreateODataRootContainer( routeName, preConfigureAction );
361+
var rootContainer = perRouteContainer.CreateODataRootContainer( routeName, perConfigureAction );
350362
var router = rootContainer.GetService<IRouter>() ?? builder.DefaultHandler;
351363

352364
builder.ConfigurePathHandler( rootContainer );
@@ -357,7 +369,7 @@ IEnumerable<IODataRoutingConvention> NewRoutingConventions( IServiceProvider ser
357369
builder.ConfigureBatchHandler( rootContainer, route );
358370
builder.Routes.Add( route );
359371
routeCollection.Add( new ODataRouteMapping( route, apiVersion, rootContainer ) );
360-
builder.AddRouteToRespondWithBadRequestWhenAtLeastOneRouteCouldMatch( routeName, routePrefix, apiVersion, inlineConstraintResolver );
372+
builder.AddRouteToRespondWithBadRequestWhenAtLeastOneRouteCouldMatch( routeName, routePrefix, apiVersion, inlineConstraintResolver, perConfigureAction );
361373
NotifyRoutesMapped();
362374

363375
return route;
@@ -484,7 +496,7 @@ IEnumerable<IODataRoutingConvention> NewRoutingConventions( IServiceProvider ser
484496
builder.ConfigureBatchHandler( rootContainer, route );
485497
builder.Routes.Add( route );
486498
routeCollection.Add( new ODataRouteMapping( route, apiVersion, rootContainer ) );
487-
builder.AddRouteToRespondWithBadRequestWhenAtLeastOneRouteCouldMatch( routeName, routePrefix, apiVersion, inlineConstraintResolver );
499+
builder.AddRouteToRespondWithBadRequestWhenAtLeastOneRouteCouldMatch( routeName, routePrefix, apiVersion, inlineConstraintResolver, configureAction );
488500
NotifyRoutesMapped();
489501

490502
return route;
@@ -552,22 +564,25 @@ static void AddRouteToRespondWithBadRequestWhenAtLeastOneRouteCouldMatch(
552564
string routeName,
553565
string routePrefix,
554566
IEnumerable<IRouteConstraint> unversionedConstraints,
555-
IInlineConstraintResolver inlineConstraintResolver )
567+
IInlineConstraintResolver inlineConstraintResolver,
568+
Action<IContainerBuilder> configureAction )
556569
{
557570
routeName += UnversionedRouteSuffix;
558571

559572
var constraint = new UnversionedODataPathRouteConstraint( unversionedConstraints );
560573
var route = new ODataRoute( builder.DefaultHandler, routeName, routePrefix, constraint, inlineConstraintResolver );
561574

562575
builder.Routes.Add( route );
576+
builder.ServiceProvider.GetRequiredService<IPerRouteContainer>().CreateODataRootContainer( routeName, configureAction );
563577
}
564578

565579
static void AddRouteToRespondWithBadRequestWhenAtLeastOneRouteCouldMatch(
566580
this IRouteBuilder builder,
567581
string routeName,
568582
string routePrefix,
569583
ApiVersion apiVersion,
570-
IInlineConstraintResolver inlineConstraintResolver )
584+
IInlineConstraintResolver inlineConstraintResolver,
585+
Action<IContainerBuilder> configureAction )
571586
{
572587
routeName += UnversionedRouteSuffix;
573588

@@ -576,6 +591,7 @@ static void AddRouteToRespondWithBadRequestWhenAtLeastOneRouteCouldMatch(
576591
var route = new ODataRoute( builder.DefaultHandler, routeName, routePrefix, constraint, inlineConstraintResolver );
577592

578593
builder.Routes.Add( route );
594+
builder.ServiceProvider.GetRequiredService<IPerRouteContainer>().CreateODataRootContainer( routeName, configureAction );
579595
}
580596

581597
static IRouteConstraint MakeVersionedODataRouteConstraint( ApiVersion apiVersion, ref string versionedRouteName )

src/Microsoft.AspNetCore.OData.Versioning/AspNet.OData/Routing/UnversionedODataPathRouteConstraint.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -66,6 +66,9 @@ public bool Match( HttpContext httpContext, IRouter route, string routeKey, Rout
6666
return false;
6767
}
6868

69+
// delete the request container because ODataPathRouteConstraint will try to create it resulting in an exception
70+
// ODataPathRouteConstraint cleans itself up afterward
71+
// REF: https://github.com/OData/WebApi/blob/master/src/Microsoft.AspNetCore.OData/Routing/ODataPathRouteConstraint.cs#L53
6972
httpContext.Request.DeleteRequestContainer( true );
7073

7174
// by evaluating the remaining unversioned constraints, this will ultimately determine whether 400 or 404

0 commit comments

Comments
 (0)