Legacy .net核心框架使用UseMvc()
添加全局路由前缀。如何在没有asp.net core 3
的情况下使它成为UseMvc()
?
您可以参考asp.net core 3.0中的以下演示,以使用api版本设置全局路由前缀。您可以根据需要通过更改services.AddMvc(o => { o.UseGeneralRoutePrefix("api/v{version:apiVersion}"); });
设置任何前缀>
1。创建自定义MvcOptionsExtensions
public static class MvcOptionsExtensions { public static void UseGeneralRoutePrefix(this MvcOptions opts, IRouteTemplateProvider routeAttribute) { opts.Conventions.Add(new RoutePrefixConvention(routeAttribute)); } public static void UseGeneralRoutePrefix(this MvcOptions opts, string prefix) { opts.UseGeneralRoutePrefix(new RouteAttribute(prefix)); } } public class RoutePrefixConvention : IApplicationModelConvention { private readonly AttributeRouteModel _routePrefix; public RoutePrefixConvention(IRouteTemplateProvider route) { _routePrefix = new AttributeRouteModel(route); } public void Apply(ApplicationModel application) { foreach (var selector in application.Controllers.SelectMany(c => c.Selectors)) { if (selector.AttributeRouteModel != null) { selector.AttributeRouteModel = AttributeRouteModel.CombineAttributeRouteModel(_routePrefix, selector.AttributeRouteModel); } else { selector.AttributeRouteModel = _routePrefix; } } } }
2。在Startup.cs中注册(您需要安装软件包Microsoft.AspNetCore.Mvc.Versioning,当前版本为3.0是4.0.0-preview8.19405.7)
public void ConfigureServices(IServiceCollection services) { services.AddControllersWithViews(); services.AddRazorPages(); services.AddMvc(o => { o.UseGeneralRoutePrefix("api/v{version:apiVersion}"); }); services.AddApiVersioning(o => o.ReportApiVersions = true); } // This method gets called by the runtime. Use this method to configure the HTTP request pipeline. public void Configure(IApplicationBuilder app, IHostingEnvironment env) { if (env.IsDevelopment()) { app.UseDeveloperExceptionPage(); } app.UseRouting(); app.UseAuthentication(); app.UseAuthorization(); app.UseEndpoints(endpoints => { endpoints.MapControllerRoute( name: "default", pattern: "{controller=Home}/{action=Index}/{id?}"); endpoints.MapRazorPages(); }); }
3.Controller:
[ApiVersion("1")] [ApiVersion("2")] [Route("test")] [ApiController] public class TestController : ControllerBase { [HttpGet("version"), MapToApiVersion("1")] public IActionResult GetV1() { return new OkObjectResult("Version One"); } }
4。结果
调用/api/v1/test/version
会得到“版本1”。