asp.net核心路由变量

asp.net core routing variable

有没有办法在不向所有 http 方法添加参数的情况下从控制器上定义的路由获取值?

我正在尝试做的事情的例子。

calling localhost/api/test/client
[Route("api/{somevar}/[controller]")]
[ApiController]
public class ClientController : ControllerBase
{
    private readonly MainContext fContext;
    private string fSomeVar;

    public ClientController(MainContext pContext)
    {
        fContext = pContext;
        fSomeVar = somevar; <-- Is there a way to get "test" from the route?
    }

    // GET: api/Client
    [HttpGet]
    public async Task<ActionResult<IEnumerable<ClientDH>>> GetClients()
    {
        // use fSomeVar here.
    }

    // GET: api/Client
    [HttpGet]
    public async Task<ActionResult<IEnumerable<ClientDH>>> GetClients(string somevar)
    {
        // this works but I'm trying to avoid changing all the methods in all controllers.
    }
}

我的建议如下:

1.You可以使用IHttpContextAccessor从http请求中获取路由值,代码如下:

 public DemoController(IHttpContextAccessor httpContextAccessor)
        {      
            fSomeVar = httpContextAccessor.HttpContext.Request.RouteValues["somevar"].ToString();
        }

并且在startup.cs中,您需要配置:

services.AddHttpContextAccessor();

2.Demo:

    [Route("api/{somevar}/[controller]")]
    [ApiController]
    public class DemoController : ControllerBase
    {
        private string fSomeVar;
        public DemoController(IHttpContextAccessor httpContextAccessor)
        {      
            fSomeVar = httpContextAccessor.HttpContext.Request.RouteValues["somevar"].ToString();
        }
        [HttpGet]
        public async Task<IActionResult> Demo1()
        {    
            try
            {
                return Ok("Id: " + fSomeVar);
            }
            catch
            {
                return BadRequest();
            }
        }

        [HttpGet("demo2/{id1}/{id2}")]
        public async Task<IActionResult> Demo2(string id1, int id2)
        {
            try
            {
                return Ok("Id1: " + id1 + ", Id2: " + id2+ ", Id3: " + fSomeVar);
            }
            catch
            {
                return BadRequest();
            }
        }
}

结果: