C# .Net Core 2.2 Web API路由

C# .Net Core 2.2 Web API路由,c#,asp.net-core,asp.net-core-mvc,asp.net-web-api-routing,asp.net-core-2.2,C#,Asp.net Core,Asp.net Core Mvc,Asp.net Web Api Routing,Asp.net Core 2.2,我有下面的控制器,我想用它作为ajax帖子的WebAPI控制器,从我的用户表中检索数据 namespace MyProjectName.Controllers.API { [Route("api/[controller]")] [ApiController] public class UsersController : ControllerBase { private readonly myContext _context; pub

我有下面的控制器,我想用它作为ajax帖子的WebAPI控制器,从我的用户表中检索数据

namespace MyProjectName.Controllers.API
{
    [Route("api/[controller]")]
    [ApiController]
    public class UsersController : ControllerBase
    {
        private readonly myContext _context;
        public UsersController(myContext context)
        {
            _context = context;
        }

        [HttpGet]
        public List<string> GetInstitutionNamesById(int id)
        {
            // returns desired list
        }
    }
}
名称空间MyProjectName.Controllers.API
{
[路由(“api/[控制器]”)]
[ApiController]
公共类UsersController:ControllerBase
{
私有只读myContext\u上下文;
公共用户控制器(myContext上下文)
{
_上下文=上下文;
}
[HttpGet]
公共列表GetInstitutionNamesById(int id)
{
//返回所需列表
}
}
}
现在我希望这个函数的路由是这样的:/api/users/getinstitutionnamesbyid,但显然它似乎只是/api/users,这让我感到非常困惑(如果我添加额外的HttpGet函数呢?)

谁能解释一下我做错了什么?我使用Web Api控制器不是预期的方式吗?我的路线错了吗

提前谢谢

[路由(“api/[控制器]”)]

使用此模板,您明确表示只关心控制器的名称。在您的示例中,
GetInstitutionNamesById
是模板未考虑的操作名称

这里有几个选项可以实现您的要求:

  • 更改
    [Route]
    模板以包含操作名称:

    [Route("api/[controller]/[action]")]
    
    此选项适用于控制器内的所有操作

  • 更改
    HttpGet
    约束属性以隐式指定操作:

    此选项确保操作方法的名称始终用作路由 部分

  • 更改
    HttpGet
    constraint属性以明确指定操作:

    此选项允许您使用与操作方法本身名称不同的路由段

  • 在这里,你是否以正确的方式使用路由,这多少是基于观点的。通常,您会看到API正试图采用RESTful,使用与资源相匹配的路由模板等。使用这种方法,您可能会有以下类似的情况:

    /api/Users/{userId}/InstitutionNames
    

    在这种情况下,您可能有一个单独的
    InstitutionNames
    控制器,或者您可以将其捆绑到
    Users
    控制器中。确实有很多方法可以做到这一点,但我在此不再赘述,因为这有点离题,而且是基于观点的。

    你只需要这样命名就可以了

        [HttpGet("[action]/{id}")]
        public List<string> GetInstitutionNamesById(int id)
        {
            // returns desired list
        }
    
    [HttpGet(“[action]/{id}”)]
    公共列表GetInstitutionNamesById(int id)
    {
    //返回所需列表
    }
    

    从ajax调用/api/users/GetInstitutionNamesById/1

    中,我同意api中的命名是令人困惑的。但我认为api的要点是,控制器的名称是您希望从中获得的,因此您实际上只有一个get操作(方法的名称与“get”无关),否则会更加混乱。您需要为其他get操作编写另一个控制器。但您也可以使用重载选项获取特定的数字,如:/api/users/3
    [HttpGet("GetInstitutionNamesById")]
    
        [HttpGet("[action]/{id}")]
        public List<string> GetInstitutionNamesById(int id)
        {
            // returns desired list
        }