.Net Core 2.2 Web API 路由

.Net Core 2.2 Web API Routing

我有以下控制器,我想将其用作 Web API 控制器,用于 ajax 帖子以从我的用户 table.

检索数据
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
        }
    }
}

现在我希望这个函数的路由是这样的:/api/users/getinstitutionnamesbyid 但显然它似乎只是 /api/users 这让我很困惑(如果我添加额外的 HttpGet 函数会怎么样?)。

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

提前致谢。

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

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

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

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

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

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

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

    [HttpGet("[action]")]
    

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

  3. 更改 HttpGet 约束属性以明确指定操作 :

    [HttpGet("GetInstitutionNamesById")]
    

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

就您是否在此处以正确的方式使用路由而言 - 这在某种程度上是基于意见的。通常,您会看到 API 正在尝试 RESTful,使用匹配资源的路由模板等。使用这种方法,您可能会得到更类似于以下内容的内容:

/api/Users/{userId}/InstitutionNames

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

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

    [HttpGet("[action]/{id}")]
    public List<string> GetInstitutionNamesById(int id)
    {
        // returns desired list
    }

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