1

I'm building a .NET 6 API Service with versioning via Content-/Accept-Header (with Microsoft.AspNetCore.Mvc.Versioning). I want the following behaviour to work:

  1. If no version is specified via the HTTP-request-header, a default version shall be assumed.
  2. If an unsupported version is specified via the HTTP-header, the service shall return with an error code (e.g. UnsupportedMediaType).

Let's say my service supports versions 1.0 and 2.0 with 2.0 as default:

Content-Type application/json;v=1.0` --> use version 1.0
Content-Type application/json;v=2.0` --> use version 2.0
Content-Type application/json`       --> use version 2.0
Content-Type application/json;v=3.0` --> error

I tried using the AssumeDefaultVersionWhenUnspecified Parameter:

    services.AddApiVersioning( opt =>
    {
        opt.DefaultApiVersion = new ApiVersion( 2, 0 );
        opt.AssumeDefaultVersionWhenUnspecified = true;
    }

But that leads to every unsupported version being also considered "unspecified", so the last case results in:

Content-Type application/json;v=3.0` --> version 2.0

Does anyone know how I can achieve the desired behaviour?

Brian Tompsett - 汤莱恩
  • 5,753
  • 72
  • 57
  • 129
Tim
  • 143
  • 1
  • 5

1 Answers1

1

Ok i think I found a solution, which I want to share if anyone ever encounters the same problem:

services.AddApiVersioning( opt =>
{
    var defaultVersion = new ApiVersion( 2, 0 );
    opt.DefaultApiVersion = defaultVersion;
    opt.AssumeDefaultVersionWhenUnspecified = true;
    opt.ReportApiVersions = true;
    opt.ApiVersionReader = new MediaTypeApiVersionReader();
    opt.ApiVersionSelector = new MyApiVersionSelector( defaultVersion );
} );

.

internal class MyApiVersionSelector : IApiVersionSelector
{
    private readonly ApiVersion defaultVersion;

    public MyApiVersionSelector( ApiVersion defaultVersion )
    {
        this.defaultVersion = defaultVersion;
    }

    public ApiVersion SelectVersion( HttpRequest request, ApiVersionModel model )
    {
        return defaultVersion;
    }
}

It's important to have the "AssumeDefaultVersionWhenUnspecified" set to true. The custom VersionSelector will be called only when no version is specified. If an unsupported version is specified, the services answers with an error.

Hope that helps someone.

Tim
  • 143
  • 1
  • 5