@@ -6,6 +6,7 @@ namespace Asp.Versioning.OData;
66using Microsoft . AspNetCore . OData . Routing . Template ;
77using Microsoft . OData . Edm ;
88using Microsoft . OData . UriParser ;
9+ using System . Runtime . CompilerServices ;
910
1011/// <summary>
1112/// Represents a versioned <see cref="IODataTemplateTranslator">OData template translator</see>.
@@ -30,9 +31,7 @@ public sealed class VersionedODataTemplateTranslator : IODataTemplateTranslator
3031
3132 if ( apiVersion == null )
3233 {
33- var metadata = context . Endpoint . Metadata . GetMetadata < ApiVersionMetadata > ( ) ;
34-
35- if ( metadata == null || ! metadata . IsApiVersionNeutral )
34+ if ( ! IsVersionNeutral ( context ) )
3635 {
3736 return default ;
3837 }
@@ -42,7 +41,13 @@ public sealed class VersionedODataTemplateTranslator : IODataTemplateTranslator
4241 var model = context . Model ;
4342 var otherApiVersion = model . GetAnnotationValue < ApiVersionAnnotation > ( model ) ? . ApiVersion ;
4443
45- if ( ! apiVersion . Equals ( otherApiVersion ) )
44+ // HACK: a version-neutral endpoint can fail to match here because odata tries to match the
45+ // first endpoint metadata when there could be multiple. such an endpoint is expected to be
46+ // the same in all versions so allow it to flow through. revisit if/when odata fixes this.
47+ //
48+ // REF: https://github.com/OData/AspNetCoreOData/issues/753
49+ // REF: https://github.com/OData/AspNetCoreOData/blob/main/src/Microsoft.AspNetCore.OData/Routing/ODataRoutingMatcherPolicy.cs#L86
50+ if ( ! apiVersion . Equals ( otherApiVersion ) && ! IsVersionNeutral ( context ) )
4651 {
4752 return default ;
4853 }
@@ -58,4 +63,9 @@ public sealed class VersionedODataTemplateTranslator : IODataTemplateTranslator
5863
5964 return new ( context . Segments ) ;
6065 }
66+
67+ [ MethodImpl ( MethodImplOptions . AggressiveInlining ) ]
68+ private static bool IsVersionNeutral ( ODataTemplateTranslateContext context ) =>
69+ context . Endpoint . Metadata . GetMetadata < ApiVersionMetadata > ( ) is ApiVersionMetadata metadata
70+ && metadata . IsApiVersionNeutral ;
6171}
0 commit comments