Asp.Net Core Versioning Web Apis Complete Guide

 Last Update:2025-06-23T00:00:00     .NET School AI Teacher - SELECT ANY TEXT TO EXPLANATION.    8 mins read      Difficulty-Level: beginner

Understanding the Core Concepts of ASP.NET Core Versioning Web APIs

ASP.NET Core Versioning Web APIs

Understanding API Versioning

API versioning is the practice of managing changes to a public API while maintaining backward-compatibility. It ensures that clients consuming different versions of an API can continue to operate correctly even as new features or enhancements are added.

Versioning Strategies

There are several common strategies for versioning APIs in ASP.NET Core:

  1. URI Versioning

    • Example: /api/v1/products, /api/v2/products
    • Pros: Simple and straightforward. Version is easily identifiable in the URL.
    • Cons: Can lead to URL bloat and confusion in a large API surface.
  2. Query String Versioning

    • Example: /api/products?api-version=1.0, /api/products?api-version=2.0
    • Pros: Does not alter the resource URI structure.
    • Cons: Can cause issues with URL-length limitations and caching.
  3. HTTP Header Versioning

    • Example: api-version=1.0 in the Accept or custom header.
    • Pros: Keeps the URL clean and does not interfere with query parameters.
    • Cons: Client must be explicitly programmed to include versioning information.
  4. Media Type Versioning

    • Example: Using Accept header for negotiation: application/vnd.product.v1+json
    • Pros: Allows for content negotiation and is not visible in the URL.
    • Cons: Can be complex to implement and is less common.

Implementing API Versioning in ASP.NET Core

ASP.NET Core provides a flexible and robust framework for implementing API versioning through the Microsoft.AspNetCore.Mvc.Versioning package.

Installing the Package

Add the Microsoft.AspNetCore.Mvc.Versioning NuGet package to your project:

dotnet add package Microsoft.AspNetCore.Mvc.Versioning
Configuring API Versioning

To enable API versioning, register the services and configure options in the Startup.cs file:

public class Startup
{
    public void ConfigureServices(IServiceCollection services)
    {
        // Add API versioning services
        services.AddApiVersioning(options =>
        {
            options.DefaultApiVersion = new ApiVersion(1, 0);
            options.AssumeDefaultVersionWhenUnspecified = true;
            options.ReportApiVersions = true;
        });

        services.AddControllers();
    }

    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }

        app.UseRouting();

        app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllers();
        });
    }
}
Applying Versioning to Controllers

Once configured, apply versioning to your controllers using attributes:

Online Code run

🔔 Note: Select your programming language to check or run code at

💻 Run Code Compiler

Step-by-Step Guide: How to Implement ASP.NET Core Versioning Web APIs

Step-by-Step Guide to ASP.NET Core Versioning Web APIs

1. Create a New ASP.NET Core Web API Project

First, let's create a new ASP.NET Core Web API project.

  1. Open Visual Studio.
  2. Select Create a new project.
  3. Choose the ASP.NET Core Web API template. Click Next.
  4. Configure your project by naming it and choosing a location. Click Create.
  5. Choose the target framework (e.g., .NET 6.0) and click Create.

2. Install the ASP.NET Core API Versioning NuGet Package

API versioning in ASP.NET Core is not built-in, so we need to install the appropriate NuGet package.

  1. In the Solution Explorer, right-click on your project and select Manage NuGet Packages.
  2. Search for "Microsoft.AspNetCore.Mvc.Versioning".
  3. Install the package.

3. Configure API Versioning in the Startup.cs or Program.cs

Depending on whether you're using the older Startup.cs configuration model or the newer Program.cs configuration model, the setup will differ slightly.

Using Startup.cs (for older ASP.NET Core versions <= 3.1)

  1. Open Startup.cs.

  2. Add the following code to the ConfigureServices method to register API versioning services:

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddControllers();
    
        // Add API Versioning
        services.AddApiVersioning(options =>
        {
            options.DefaultApiVersion = new ApiVersion(1, 0); // Default version
            options.AssumeDefaultVersionWhenUnspecified = true; // Assume default version when not specified
            options.ReportApiVersions = true; // Report supported versions
        });
    
        // Add API versioning with format versioning
        services.AddVersionedApiExplorer(options =>
        {
            options.GroupNameFormat = "'v'VVV"; // Format the version group name
            options.SubstituteApiVersionInUrl = true; // Substitute api version in the URL
        });
    }
    
    public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
    {
        if (env.IsDevelopment())
        {
            app.UseDeveloperExceptionPage();
        }
    
        app.UseRouting();
    
        app.UseEndpoints(endpoints =>
        {
            endpoints.MapControllers();
        });
    }
    

Using Program.cs (for newer ASP.NET Core versions >= 6.0)

  1. Open Program.cs.

  2. Add the following code to register API versioning services:

    var builder = WebApplication.CreateBuilder(args);
    
    // Add services to the container.
    builder.Services.AddControllers();
    
    // Add API Versioning
    builder.Services.AddApiVersioning(options =>
    {
        options.DefaultApiVersion = new ApiVersion(1, 0); // Default version
        options.AssumeDefaultVersionWhenUnspecified = true; // Assume default version when not specified
        options.ReportApiVersions = true; // Report supported versions
    });
    
    // Add API versioning with format versioning
    builder.Services.AddVersionedApiExplorer(options =>
    {
        options.GroupNameFormat = "'v'VVV"; // Format the version group name
        options.SubstituteApiVersionInUrl = true; // Substitute api version in the URL
    });
    
    var app = builder.Build();
    
    // Configure the HTTP request pipeline.
    if (app.Environment.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    
    app.UseHttpsRedirection();
    
    app.UseAuthorization();
    
    app.MapControllers();
    
    app.Run();
    

4. Define Versions in Your Controllers

You can version your APIs in several ways, such as URL-based versioning, query string-based versioning, or media type-based versioning. Here, we will use URL-based versioning.

Using URL-based Versioning

  1. Open an existing controller (e.g., WeatherForecastController.cs) or create a new one.

  2. Use the ApiVersion attribute to specify the version(s) for the controller or specific actions:

    using Microsoft.AspNetCore.Mvc;
    using System.Collections.Generic;
    
    namespace YourNamespace.Controllers
    {
        [ApiController]
        [Route("api/v{version:apiVersion}/[controller]")]
        public class WeatherForecastController : ControllerBase
        {
            [HttpGet]
            [ApiVersion("1.0")]
            public IEnumerable<string> GetV1()
            {
                return new[] { "Version 1.0 - Weather Forecast" };
            }
    
            [HttpGet]
            [ApiVersion("2.0")]
            public IEnumerable<string> GetV2()
            {
                return new[] { "Version 2.0 - Weather Forecast" };
            }
        }
    }
    

5. Test Your Versioned API

  1. Run your application.
  2. Use a tool like Postman or your browser to test the different versions:
    • To access Version 1: https://localhost:yourport/api/v1/weatherforecast
    • To access Version 2: https://localhost:yourport/api/v2/weatherforecast

6. Add Filters and Optional Parameters (Optional)

You can add custom filters and optional parameters to make your versioned API more flexible. Here's an example:

  1. Open the WeatherForecastController.cs file.

  2. Add a filter to conditionally apply versioning:

    using Microsoft.AspNetCore.Mvc;
    using System.Collections.Generic;
    
    namespace YourNamespace.Controllers
    {
        [ApiController]
        [Route("api/weatherforecast")]
        public class WeatherForecastController : ControllerBase
        {
            [HttpGet]
            [ApiVersion("1.0")]
            public IEnumerable<string> GetV1()
            {
                return new[] { "Version 1.0 - Weather Forecast" };
            }
    
            [HttpGet]
            [ApiVersion("2.0")]
            public IEnumerable<string> GetV2()
            {
                return new[] { "Version 2.0 - Weather Forecast" };
            }
        }
    }
    

    In this example, the base route does not include the version, but you can still use query string parameters to specify the version. For example:

    • Version 1: https://localhost:yourport/api/weatherforecast?api-version=1.0
    • Version 2: https://localhost:yourport/api/weatherforecast?api-version=2.0

7. Use Versioned API Explorers (Optional)

If you want to provide a UI for exploring the different versions of your API, you can use tools like Swashbuckle (Swagger) with versioned API explorers.

  1. Install the Swashbuckle.AspNetCore NuGet package:

    dotnet add package Swashbuckle.AspNetCore
    
  2. Configure Swagger in Program.cs or Startup.cs:

    var builder = WebApplication.CreateBuilder(args);
    
    // Add services to the container.
    builder.Services.AddControllers();
    
    // Add API Versioning
    builder.Services.AddApiVersioning(options =>
    {
        options.DefaultApiVersion = new ApiVersion(1, 0);
        options.AssumeDefaultVersionWhenUnspecified = true;
        options.ReportApiVersions = true;
    });
    
    builder.Services.AddVersionedApiExplorer(options =>
    {
        options.GroupNameFormat = "'v'VVV";
        options.SubstituteApiVersionInUrl = true;
    });
    
    // Configure Swashbuckle
    builder.Services.AddSwaggerGen(options =>
    {
        var provider = builder.Services.BuildServiceProvider().GetRequiredService<IApiVersionDescriptionProvider>();
        foreach (var description in provider.ApiVersionDescriptions)
        {
            options.SwaggerDoc(description.GroupName, new Microsoft.OpenApi.Models.OpenApiInfo
            {
                Title = $"Sample API {description.GroupName}",
                Version = description.ApiVersion.ToString()
            });
        }
    });
    
    var app = builder.Build();
    
    // Configure the HTTP request pipeline.
    if (app.Environment.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
        app.UseSwagger();
        app.UseSwaggerUI(options =>
        {
            var provider = app.Services.GetRequiredService<IApiVersionDescriptionProvider>();
            foreach (var description in provider.ApiVersionDescriptions)
            {
                options.SwaggerEndpoint($"/swagger/{description.GroupName}/swagger.json", description.GroupName.ToUpperInvariant());
            }
        });
    }
    
    app.UseHttpsRedirection();
    
    app.UseAuthorization();
    
    app.MapControllers();
    
    app.Run();
    
  3. Run your application and navigate to the Swagger UI at https://localhost:yourport/swagger to see the different versions of your API.

Summary

Top 10 Interview Questions & Answers on ASP.NET Core Versioning Web APIs

Top 10 Questions and Answers on ASP.NET Core Versioning for Web APIs

1. What is API versioning in ASP.NET Core?

2. What are the common strategies for versioning APIs in ASP.NET Core?

Answer: The common strategies for versioning APIs in ASP.NET Core are:

  • URL Versioning: This places the version directly in the URL (api/v1/values).
  • Header Versioning: This uses a custom HTTP header to pass the version.
  • Query String Versioning: This appends the version as a query parameter (api/values?api-version=1.0).
  • Accept Header Versioning: Uses the Accept header with a custom media type to specify the version.

3. How do you implement URL versioning in ASP.NET Core?

Answer: Implementing URL versioning involves configuring the routing to include the version. Here’s an example:

// In Startup.cs
services.AddApiVersioning(options =>
{
    options.ApiVersionReader = new UrlSegmentApiVersionReader();
});

And in your controllers:

// Version 1
[ApiVersion("1.0")]
[Route("api/v{version:apiVersion}/[controller]")]
public class ValuesController : ControllerBase
{
    [HttpGet]
    public IActionResult Get() => Ok("Version 1");
}

// Version 2
[ApiVersion("2.0")]
[Route("api/v{version:apiVersion}/[controller]")]
public class ValuesController : ControllerBase
{
    [HttpGet]
    public IActionResult Get() => Ok("Version 2");
}

4. What is the advantage of using header versioning in ASP.NET Core?

Answer: Header versioning allows you to specify the version in a custom HTTP header, such as api-version: 1.0. This can be beneficial when you need to keep your URLs clean and avoid exposing versioning details to the client directly. It also provides flexibility in how clients specify the version they prefer.

5. How can you implement header versioning in ASP.NET Core?

Answer: Implementing header versioning involves configuring the API versioning options to read from a custom HTTP header as follows:

// In Startup.cs
services.AddApiVersioning(options =>
{
    options.ApiVersionReader = new HeaderApiVersionReader("api-version");
});

Then, specify the version using a custom header in your requests.

6. What is the best practice for choosing the API versioning strategy?

Answer: Choosing the best API versioning strategy depends on your specific needs and constraints. URL versioning is simple and intuitive but can clutter URLs. Header versioning is clean but not as obvious to clients. Query string versioning provides flexibility but is not favored by purists of REST. Accept header versioning is less commonly used but avoids URL clutter. It’s recommended to choose a method that aligns with your team’s conventions and the specific requirements of your API consumers.

7. How do you handle versioning in a RESTful way?

Answer: RESTful design emphasizes the use of URLs to represent resources. To version RESTful APIs, incorporate the version in the URL, such as api/v1/products. However, be cautious of overcomplicating URIs. Ensure that all versioned endpoints follow REST principles, including using well-defined HTTP methods and maintaining statelessness.

8. What steps should be taken when deprecating an API version?

Answer: When deprecating an API version, follow these steps:

  • Communicate: Clearly inform your API consumers about the upcoming deprecation with enough notice.
  • Provide Alternatives: Direct users to new versions of the API and provide detailed migration guides.
  • Graceful Degradation: Allow deprecated versions to continue working but log deprecation warnings.
  • Sunset: After providing enough transition time, disable the deprecated versions to ensure users migrate to newer versions.

9. Can you provide an example of query string versioning in ASP.NET Core?

Answer: Implementing query string versioning involves specifying the version as a query parameter:

// In Startup.cs
services.AddApiVersioning(options =>
{
    options.ApiVersionReader = new QueryStringApiVersionReader("api-version");
});

Then, clients can specify the version using a query string:

GET /api/values?api-version=1.0

10. How do you document different API versions in ASP.NET Core?

Answer: Documenting different API versions is crucial for providing clear guidance to your API consumers. Here are some strategies:

  • Swagger/OpenAPI: Use tools like Swashbuckle to generate API documentation and visually separate multiple versions. Ensure each version has its own documentation page.
  • Comments: Provide XML comments within your code which are then used by the documentation tool to generate more detailed API documentation.
  • Wiki/Readme: Include an external documentation site or README file that outlines differences between each version, migration paths, and usage examples.

You May Like This Related .NET Topic

Login to post a comment.