Search code examples
c#.netasp.net-core-3.1aspnet-api-versioning

Cannot disable the default API versioner when upgrading from .NET Core 2.2 to 3.1


I'm currently going through the process of upgrading from 2.2 to 3.1.

In doing so .NET's default api-versioner is running along side ours despite adding the code to remove this:

Is there a new way to register a custom versioner or is there a new approach to removing .NET's default one after calling 'AddApiVersioning'.

services.AddControllers(opts =>
{
    opts.Filters.Add<DatedApiVersionFilter>();
});

// add standard asp.net core versioning mechanism
services.AddApiVersioning(o =>
{
    o.ApiVersionReader = new HeaderApiVersionReader(PlatformVersioningOptions.VersionHeaderName);
    o.DefaultApiVersion = new ApiVersionDate(2020, 1, 31);
    o.AssumeDefaultVersionWhenUnspecified = true;
});

// removing the default api version policy        
services.Remove(services.Single(s => s.ImplementationType == typeof(DefaultApiVersionRoutePolicy)));
services.TryAddEnumerable(ServiceDescriptor.Singleton<MatcherPolicy, DatedApiVersionMatcherPolicy>());
services.AddSingleton<IDatedApiVersionResolver, DatedApiVersionResolver>();

Solution

  • I've managed to solve this by removing the call to 'services.AddApiVersioning()'.

    It seems in .NET Core 3.1 adding the filter with the new 'AddControllers' extension is enough to kick off our versioning policy for any endpoint decorated with the filter.

    Final implementation:

            services.AddControllers(opts =>
            {
                opts.Filters.Add<DatedApiVersionFilter>();
            });
    
            services.TryAddEnumerable(ServiceDescriptor.Singleton<MatcherPolicy, DatedApiVersionMatcherPolicy>());
            services.AddSingleton<IDatedApiVersionResolver, DatedApiVersionResolver>();