如何在asp.net core 3中添加全局路由前缀?

问题描述 投票:1回答:1

Legacy .net核心框架使用UseMvc()添加全局路由前缀。如何在没有asp.net core 3的情况下使它成为UseMvc()

asp.net-core routes
1个回答
0
投票

您可以参考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”。

© www.soinside.com 2019 - 2024. All rights reserved.