WebAPI核心路由问题

Ahm*_*yas 19 c# .net-core asp.net-core asp.net-core-webapi asp.net-core-routing

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

我有几个控制器,如:

SchoolController
TeacherController.

两者都有获取: 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}'
Run Code Online (Sandbox Code Playgroud)

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

/api/{controller}/1

etc... ?
Run Code Online (Sandbox Code Playgroud)

现在,我还有另一个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
    }
}
Run Code Online (Sandbox Code Playgroud)

并为学校控制员:

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

要明确 - 问题是:

  • 为什么在Web应用程序启动后立即收到运行时错误?

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

Nko*_*osi 27

控制器不能具有相同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) {
        //...
    }
}
Run Code Online (Sandbox Code Playgroud)


小智 9

从两个控制器上删除“获取操作”名称将解决问题