• asp.net core 3.0+中的全局路由和接口版本控制


    想给服务中的所有接口加上一个版本前缀,如http://localhost/values/test =>http://localhost/v2/values/test, 或者是在cunsol中注册服务时要添加一个全局tags,如:urlprefix-

    1. Create a custom MvcOptionsExtensions

    using Microsoft.AspNetCore.Mvc;
    using Microsoft.AspNetCore.Mvc.ApplicationModels;
    using Microsoft.AspNetCore.Mvc.Routing;
    using System.Linq;
    
    namespace MvcRouteExtension
    {
        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类中注册,版本控制使用到了 Microsoft.AspNetCore.Mvc.Versioning

    public void ConfigureServices(IServiceCollection services)
        {
            //MVC service registration
            //https://docs.microsoft.com/en-us/aspnet/core/migration/22-to-30?view=aspnetcore-3.0&tabs=visual-studio#mvc-service-registration
            services.AddControllersWithViews(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. 使用

    [ApiVersion("1")]
    [ApiVersion("2")]
    [Route("test")]
    [ApiController]
    public class TestController : ControllerBase
    {
        [HttpGet("version"), MapToApiVersion("1")]
        public IActionResult GetV1()
        {
            return new OkObjectResult("Version One");
        }
    
        [HttpGet("version"), MapToApiVersion("2")]
        public IActionResult GetV2()
        {
            return new OkObjectResult("Version Tow");
        }
    }

    4.测试

    http://localhost/api/v1/test/version

    http://localhost/api/v2/test/version

  • 相关阅读:
    Spring 事务管理tx,aop
    好的博客参考之Spring
    Spring 事务管理
    Eclipse+Tomcat+MAVEN+SVN项目完整环境搭建
    ssm框架搭建
    SSH整合不错的博客
    org.springframework.beans.factory.CannotLoadBeanClassException: Cannot find class [com.my.service.ProductService] for bean with name 'productService' defi报错解决方法
    修改firefox的默认缩放比
    深入理解计算机系统笔记
    OnePlus5刷机后一直检查更新
  • 原文地址:https://www.cnblogs.com/xuf22/p/12190619.html
Copyright © 2020-2023  润新知