一、基于路由的版本控制
在ASP.NET Core 中,我们可以通过在路由中添加版本号来实现版本控制。
配置路由
首先,在Startup.cs文件的ConfigureServices方法中,注册Mvc服务并配置路由。
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
services.AddMvc(option => option.EnableEndpointRouting = false)
.SetCompatibilityVersion(CompatibilityVersion.Version_3_0)
.AddMvcOptions(options =>
{
options.Conventions.Add(new RouteTokenTransformerConvention(new SlugifyParameterTransformer()));
});
}
这里的SlugifyParameterTransformer是一个自定义的参数转换器,用于将参数转换为小写。
定义控制器
创建不同版本的控制器,例如v1和v2版本的ValuesController。
[ApiController]
[Route("api/v{version:apiVersion}/[controller]")]
[ApiVersion("1.0")]
public class ValuesController : ControllerBase
{
// GET api/v1/values
[HttpGet]
public IActionResult Get()
{
return Ok(new string[] { "value1", "value2" });
}
}
[ApiController]
[Route("api/v{version:apiVersion}/[controller]")]
[ApiVersion("2.0")]
public class ValuesControllerV2 : ControllerBase
{
// GET api/v2/values
[HttpGet]
public IActionResult Get()
{
return Ok(new string[] { "value3", "value4" });
}
}
通过在路由中指定v{version:apiVersion},并在控制器上使用[ApiVersion]特性来标识版本。
二、基于查询字符串的版本控制
除了基于路由的版本控制,还可以通过查询字符串来实现版本控制。
配置版本控制选项
在Startup.cs文件的ConfigureServices方法中,配置ApiVersioningOptions。
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
services.AddApiVersioning(options =>
{
options.AssumeDefaultVersionWhenUnspecified = true;
options.DefaultApiVersion = new ApiVersion(1, 0);
options.ReportApiVersions = true;
options.ApiVersionReader = ApiVersionReader.Query("api-version");
});
}
这里设置了默认版本为1.0,并指定通过查询字符串api-version来读取版本号。
定义控制器
与基于路由的版本控制类似,创建不同版本的控制器。
[ApiController]
[Route("api/[controller]")]
[ApiVersion("1.0")]
public class ProductsController : ControllerBase
{
// GET api/products?api-version=1.0
[HttpGet]
public IActionResult Get()
{
return Ok(new string[] { "product1", "product2" });
}
}
[ApiController]
[Route("api/[controller]")]
[ApiVersion("2.0")]
public class ProductsControllerV2 : ControllerBase
{
// GET api/products?api-version=2.0
[HttpGet]
public IActionResult Get()
{
return Ok(new string[] { "product3", "product4" });
}
}
客户端通过在查询字符串中传递api-version参数来指定要访问的版本。
三、基于媒体类型的版本控制
基于媒体类型的版本控制是通过在请求头中指定Accept媒体类型来实现的。
配置版本控制选项
在Startup.cs文件的ConfigureServices方法中,配置ApiVersioningOptions。
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
services.AddApiVersioning(options =>
{
options.AssumeDefaultVersionWhenUnspecified = true;
options.DefaultApiVersion = new ApiVersion(1, 0);
options.ReportApiVersions = true;
options.ApiVersionReader = ApiVersionReader.MediaTypeHeader("ver");
});
}
这里指定通过Accept头中的ver媒体类型参数来读取版本号。
定义控制器
同样创建不同版本的控制器。
[ApiController]
[Route("api/[controller]")]
[ApiVersion("1.0")]
[Produces("application/vnd.example.v1+json")]
public class OrdersController : ControllerBase
{
// GET api/orders
[HttpGet]
public IActionResult Get()
{
return Ok(new string[] { "order1", "order2" });
}
}
[ApiController]
[Route("api/[controller]")]
[ApiVersion("2.0")]
[Produces("application/vnd.example.v2+json")]
public class OrdersControllerV2 : ControllerBase
{
// GET api/orders
[HttpGet]
public IActionResult Get()
{
return Ok(new string[] { "order3", "order4" });
}
}
客户端在请求头中设置Accept: application/vnd.example.v1+json或Accept: application/vnd.example.v2+json来指定版本。
以上就是在ASP.NET Core WebAPI 中实现版本控制的几种常见方式,开发者可以根据实际需求选择合适的方式来进行版本控制。
该文章在 2025/2/20 9:30:30 编辑过