如何向 asp .net core Web API 中的每个端点添加“api”前缀

Pas*_*han 6 .net c# .net-core asp.net-core

我需要自动将 api/ 前缀添加到我的 asp .net core Web API 中的每个端点。怎么做?

Ren*_*ena 5

您可以自定义MvcOptionsExtensions全局设置路由前缀,而不用手动更改路由属性。

1.定制MvcOptionsExtensions

public static class MvcOptionsExtensions
{
    public static void UseRoutePrefix(this MvcOptions opts, IRouteTemplateProvider routeAttribute)
    {
        opts.Conventions.Add(new RoutePrefixConvention(routeAttribute));
    }

    public static void UseRoutePrefix(this MvcOptions opts, string
    prefix)
    {
        opts.UseRoutePrefix(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;
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

2:在Startup.cs(.Net6之前的版本)或Program.cs(.Net 6以上的版本)中注册:

services.AddControllers(o =>{
    o.UseRoutePrefix("api");
});
Run Code Online (Sandbox Code Playgroud)

或者:

builder.Services.AddControllers(o =>{
    o.UseRoutePrefix("api");
});
Run Code Online (Sandbox Code Playgroud)


Pan*_*kaj 1

使用路由前缀“api/”创建控制器构造函数

例如,假设您的控制器类名称是 CustomerController

[Route("api/[controller]")]
public class CustomerController : ControllerBase
{

}

// This will become api/customer
[HttpGet]
public async Task<ActionResult> GetCustomers()
{
   // Code to get Customers
}

// This will become api/customer/{id}
[HttpGet]
[Route("{id}")]
public async Task<ActionResult> GetCustomerById(int id)
{
   // Code to get Customer by Id
}
    
Run Code Online (Sandbox Code Playgroud)