这个想法是通过 URL 拥有一个版本化的 API,如下所示:
- /api/v1/天气预报
- /api/v2/天气预报
- /api/v3/天气预报
我的命名空间如下:
在启动时我有这个代码来注册版本控制:
public void ConfigureServices(IServiceCollection services)
{
services.AddControllers();
services.AddApiVersioning(
options =>
{
// reporting api versions will return the headers "api-supported-versions" and "api-deprecated-versions"
options.ReportApiVersions = true;
// automatically applies an api version based on the name of the defining controller's namespace
options.Conventions.Add(new VersionByNamespaceConvention());
});
}
所以我想删除每个控制器中的“[Route("api/v{version:apiVersion}/[controller]")]"属性这可能吗?
我试图使用这样的东西来映射控制器:
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
app.UseHttpsRedirection();
app.UseRouting();
app.UseAuthorization();
app.UseEndpoints(endpoints =>
{
endpoints.MapControllerRoute(
name: "api",
pattern: "api/v{version:apiVersion}/{controller}/{id?}"
);
});
}
但是当我运行代码时,它给出了以下错误:
操作“ApiVersioning.Api.V3.Controllers.WeatherForecastController.Get (ApiVersioning)”没有属性路由。使用 ApiControllerAttribute 注释的控制器上的操作方法必须是属性路由。
那么我可以为所有控制器添加一个隐式路由约定,从而消除对每个控制器顶部的 RouteAttribute 的需要吗?