Skip to content

Endpoint routing with apiversioning support for OData core 7.4.1 #647

Closed
@dxynnez

Description

@dxynnez

Endpoint routing for OData core seems to be supported since 7.4.0, I am just wondering whether the apiversioning can work with it or not?

I have the following code in my startup:

            services.AddApiVersioning(options =>
            {
                options.ReportApiVersions = true;
                options.AssumeDefaultVersionWhenUnspecified = true;
                options.DefaultApiVersion = new ApiVersion(1, 0);
            });

            services.AddVersionedApiExplorer(options =>
            {
                options.GroupNameFormat = "'v'VVV";
                options.SubstituteApiVersionInUrl = true;
            });

            services.AddODataApiExplorer(options =>
            {
                options.GroupNameFormat = "'v'VVV";
                options.SubstituteApiVersionInUrl = true;
            });

            services.AddOData().EnableApiVersioning();

            services.AddControllers(options =>
                {
                    foreach (var outputFormatter in options.OutputFormatters.OfType<ODataOutputFormatter>().Where(_ => _.SupportedMediaTypes.Count == 0))
                    {
                        outputFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("application/prs.odatatestxx-odata"));
                    }

                    foreach (var inputFormatter in options.InputFormatters.OfType<ODataInputFormatter>().Where(_ => _.SupportedMediaTypes.Count == 0))
                    {
                        inputFormatter.SupportedMediaTypes.Add(new MediaTypeHeaderValue("application/prs.odatatestxx-odata"));
                    }
                }).AddControllersAsServices().SetCompatibilityVersion(CompatibilityVersion.Latest);

And

            app.UseEndpoints(endpoints =>
            {
                endpoints.MapControllers();
                endpoints.Select().Filter().OrderBy().Count().MaxTop(10);
                endpoints.MapODataRoute("odata", "odata", this.GetEdmModel());
                endpoints.EnableDependencyInjection();
            });

I can sort of get the ApiVersioning to work for a GET OData API, but it doesn't seem to work for POST - I always hit the following NRE:

System.NullReferenceException: Object reference not set to an instance of an object.
   at Microsoft.AspNetCore.Mvc.Routing.ApiVersionMatcherPolicy.EvaluateApiVersion(CandidateSet candidates, ApiVersion apiVersion)
   at Microsoft.AspNetCore.Mvc.Routing.ApiVersionMatcherPolicy.ApplyAsync(HttpContext httpContext, CandidateSet candidates)
   at Microsoft.AspNetCore.Routing.Matching.DfaMatcher.SelectEndpointWithPoliciesAsync(HttpContext httpContext, IEndpointSelectorPolicy[] policies, CandidateSet candidateSet)
   at Microsoft.AspNetCore.Routing.EndpointRoutingMiddleware.<Invoke>g__AwaitMatch|8_1(EndpointRoutingMiddleware middleware, HttpContext httpContext, Task matchTask)

NOTE: even for the get API, it doesn't work properly - If I call the GET API with a non-existent version, I get the same NRE.

Did I misconfig something or it's indeed not supported? Thanks in advance!

Metadata

Metadata

Type

No type

Projects

No projects

Relationships

None yet

Development

No branches or pull requests

Issue actions