From 888feefae572c5c239d2f055e8f2d383bedbbb99 Mon Sep 17 00:00:00 2001 From: Chris Martinez Date: Sat, 13 Dec 2025 20:22:38 -0800 Subject: [PATCH] The OData specification should internally match entire controllers or a subset of their actions. Fixes #1118 --- .../ApplicationModels/ODataControllerSpecification.cs | 7 ++++--- .../OData/ODataApplicationModelProvider.cs | 3 ++- .../Routing/VersionedAttributeRoutingConvention.cs | 4 ++-- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/src/AspNetCore/OData/src/Asp.Versioning.OData/ApplicationModels/ODataControllerSpecification.cs b/src/AspNetCore/OData/src/Asp.Versioning.OData/ApplicationModels/ODataControllerSpecification.cs index eb1cebd0..7f554e9b 100644 --- a/src/AspNetCore/OData/src/Asp.Versioning.OData/ApplicationModels/ODataControllerSpecification.cs +++ b/src/AspNetCore/OData/src/Asp.Versioning.OData/ApplicationModels/ODataControllerSpecification.cs @@ -3,6 +3,7 @@ namespace Asp.Versioning.ApplicationModels; using Microsoft.AspNetCore.Mvc.ApplicationModels; +using Microsoft.AspNetCore.OData.Edm; using Microsoft.AspNetCore.OData.Routing.Attributes; /// @@ -16,7 +17,7 @@ public bool IsSatisfiedBy( ControllerModel controller ) { ArgumentNullException.ThrowIfNull( controller ); - if ( ODataControllerSpecification.IsSatisfiedBy( controller ) ) + if ( Matches( controller ) ) { return true; } @@ -25,7 +26,7 @@ public bool IsSatisfiedBy( ControllerModel controller ) for ( var i = 0; i < actions.Count; i++ ) { - if ( IsSatisfiedBy( actions[i] ) ) + if ( Matches( actions[i] ) ) { return true; } @@ -34,7 +35,7 @@ public bool IsSatisfiedBy( ControllerModel controller ) return false; } - internal static bool IsSatisfiedBy( ICommonModel model ) + internal static bool Matches( ICommonModel model ) { var attributes = model.Attributes; diff --git a/src/AspNetCore/OData/src/Asp.Versioning.OData/OData/ODataApplicationModelProvider.cs b/src/AspNetCore/OData/src/Asp.Versioning.OData/OData/ODataApplicationModelProvider.cs index 9ef71b7b..3dfaa9af 100644 --- a/src/AspNetCore/OData/src/Asp.Versioning.OData/OData/ODataApplicationModelProvider.cs +++ b/src/AspNetCore/OData/src/Asp.Versioning.OData/OData/ODataApplicationModelProvider.cs @@ -79,6 +79,7 @@ private static CollateApiVersions( ApplicationModel application ) { var controllers = application.Controllers; + var specification = new ODataControllerSpecification(); var metadataControllers = default( List ); var supported = default( SortedSet ); var deprecated = default( SortedSet ); @@ -93,7 +94,7 @@ private static metadataControllers.Add( controller ); continue; } - else if ( !ODataControllerSpecification.IsSatisfiedBy( controller ) ) + else if ( !specification.IsSatisfiedBy( controller ) ) { continue; } diff --git a/src/AspNetCore/OData/src/Asp.Versioning.OData/Routing/VersionedAttributeRoutingConvention.cs b/src/AspNetCore/OData/src/Asp.Versioning.OData/Routing/VersionedAttributeRoutingConvention.cs index 230017ed..96e643e8 100644 --- a/src/AspNetCore/OData/src/Asp.Versioning.OData/Routing/VersionedAttributeRoutingConvention.cs +++ b/src/AspNetCore/OData/src/Asp.Versioning.OData/Routing/VersionedAttributeRoutingConvention.cs @@ -95,12 +95,12 @@ public override bool AppliesToAction( ODataControllerActionContext context ) private static bool IsODataController( ODataControllerActionContext context ) { - if ( ODataControllerSpecification.IsSatisfiedBy( context.Controller ) ) + if ( ODataControllerSpecification.Matches( context.Controller ) ) { return true; } - return ODataControllerSpecification.IsSatisfiedBy( context.Action ); + return ODataControllerSpecification.Matches( context.Action ); } private static IEdmModel? FindModel( ODataControllerActionContext context )