【问题标题】:WebAPI Core routing issuesWebAPI 核心路由问题
【发布时间】: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 进行操作。

标签: c# asp.net-core .net-core asp.net-core-webapi asp.net-core-routing


【解决方案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) 响应中很有用
  • 具体原因是什么??
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-05-14
  • 1970-01-01
  • 2013-07-03
  • 2020-07-18
  • 2018-03-14
  • 1970-01-01
  • 2021-04-21
相关资源
最近更新 更多