アイデアは、次のように 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 の必要性をなくす、すべてのコントローラーに暗黙的なルーティング規則を追加することはできますか?