zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    eclipse提速01
    eclipse提速02
    快速清空Access资料库中所有表的数据
    删除数据之后自增长列重新开始计数
    JS中控制两个小数位
    JS控制table中tr位置互换
    MIME 类型列表
    JS中对于email格式的判断
    获取网站根目录的方法
    通过存储过程创建SQL作业
  • 原文地址:https://www.cnblogs.com/xuf22/p/12190619.html
Copyright © 2011-2022 走看看