Skip to content

Commit 8bf2581

Browse files
Provide workaround for OData/AspNetCoreOData#753
1 parent 95bf9be commit 8bf2581

File tree

1 file changed

+14
-4
lines changed

1 file changed

+14
-4
lines changed

src/AspNetCore/OData/src/Asp.Versioning.OData/OData/VersionedODataTemplateTranslator.cs

Lines changed: 14 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ namespace Asp.Versioning.OData;
66
using Microsoft.AspNetCore.OData.Routing.Template;
77
using Microsoft.OData.Edm;
88
using 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

Comments
 (0)