WebAPI 核心路由问题

Posted

技术标签:

【中文标题】WebAPI 核心路由问题【英文标题】:WebAPI Core routing issues 【发布时间】:2018-07-07 15:54:00 【问题描述】:

所以,我正在使用 Web API (ASP.NET Core 2) 并遇到路由问题。

我有几个控制器,例如:

学校控制器 教师控制器。

两者都有获取:Get(int id)

问题是,当我运行它时,我什至在实际能够调用这些方法之前就遇到了运行时错误。

Attribute routes with the same name 'Get' must have the same template:
Action: MyProject.WebAPI.Controllers.SchoolController.Get (MyProject.WebAPI)' - Template: 'api/school/id'
Action: MyProject.WebAPI.Controllers.TeacherController.Get (MyProject.WebAPI)' - Template: 'api/teacher/id'

当控制器应该有自己的 Gets 等时为什么要这样做......所以你可以这样做:

/api/controller/1

etc... ?

现在,我还有另一个 Get 方法,都在它们的控制器中,但具有不同的方法签名以及不同的 HttpGet 名称,即:

// TeachersController:

[Produces("application/json")]
[Route("api/teacher")]
public class TeacherController : Controller


    // GET: api/Teacher/5
    [HttpGet("id", Name = "Get")]
    public IActionResult Get(int id)
    

        // BLAH
    

对于学校管理员:

[Produces("application/json")]
[Route("api/school")]
public class SchoolController : Controller


    [HttpGet("id", Name = "Get")]
    public IActionResult Get(int id)
    
        // BLAH
    

    [HttpGet("SearchBasic")]
    public IActionResult SearchBasic(string schoolName, string zipCode)
    
        // BLAH
    

要明确 - 问题是:

为什么我一启动 Web 应用程序就会收到运行时错误?

get 是在不同的控制器上,为什么会有冲突呢?

【问题讨论】:

对...你不能像在控制器中那样使用相同的Name 进行操作。 【参考方案1】:

控制器不能有具有相同路由Name 的操作。它们必须是唯一的,以便路由表可以区分它们。

参考Routing to Controller Actions : Route Name

路由名称可用于根据特定路由生成 URL。路由名称对路由的 URL 匹配行为没有影响,仅用于 URL 生成。 路由名称在应用程序范围内必须是唯一的。

强调我的

更新路线名称

[Route("api/teacher")]
public class TeacherController : Controller 

    // GET: api/Teacher/5
    [HttpGet("id", Name = "GetTeacher")]
    public IActionResult Get(int id) 
        //...
    


[Route("api/school")]
public class SchoolController : Controller

    // GET: api/school/5
    [HttpGet("id", Name = "GetSchool")]
    public IActionResult Get(int id) 
        //...
    

【讨论】:

太棒了。谢谢你。固定! 我想知道如果有 2 个不同的控制器类,为什么 .NET 核心不允许相同的动作名称 - Get() ?谢谢 @Cheung 因为它们最终在同一个路由表中,所以名称必须是唯一的。即使在另一个控制器中。【参考方案2】:

从两个控制器中删除 get 操作的名称将解决问题

【讨论】:

我在使用 dotnet aspnet-codegenerator 脚手架时遇到了这个问题。生成的代码将 Name 属性添加到 HttpGet。删除 Name 属性解决了这个问题。 Name 在 CreatedAtRoute(nameof(GetTeacherAsync),new , res) 响应中很有用 具体原因是什么??

以上是关于WebAPI 核心路由问题的主要内容,如果未能解决你的问题,请参考以下文章

WebAPI - 属性路由 POST 不适用于 WebAPI Cors?

.NET core 2.1 Web API 是不是支持基于约定的路由?

如何正确映射 WebAPI 路由

确保 WebAPI2 路由在 MVC 路由之前匹配

WebApi 2 路由机制

WebApi-路由机制