.Net Core 2.2 Web API路由

Tim*_*ard 2 c# asp.net-web-api-routing asp.net-core-mvc asp.net-core asp.net-core-2.2

我有以下控制器,希望将其用作ajax帖子的Web API控制器,以从用户表中检索数据。

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
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,我希望此函数的路由如下所示:/ api / users / getinstitutionnamesbyid,但显然它似乎只是/ api / users,我确实感到困惑(如果我添加其他HttpGet函数会怎样?)。

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

提前致谢。

Kir*_*kin 11

[Route("api/[controller]")]

使用此模板,您可以明确地声明只关心控制器的名称。在您的示例中,GetInstitutionNamesByIdaction的名称,模板未考虑该名称。

这里有一些实现您要求的选项:

  1. 更改[Route]模板以包括操作名称:

    [Route("api/[controller]/[action]")]
    
    Run Code Online (Sandbox Code Playgroud)

    此选项适用于控制器内的所有操作。

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

    [HttpGet("[action]")]
    
    Run Code Online (Sandbox Code Playgroud)

    此选项可确保您的操作方法的名称始终用作路由段。

  3. 更改HttpGet约束属性以显式指定操作:

    [HttpGet("GetInstitutionNamesById")]
    
    Run Code Online (Sandbox Code Playgroud)

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

关于您是否在这里以正确的方式使用路由-这有点基于观点。通常,您会看到API正在尝试使用与资源匹配的路由模板来实现RESTful,通过这种方法,您可能会更喜欢以下内容:

[Route("api/[controller]/[action]")]
Run Code Online (Sandbox Code Playgroud)

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