所以,我正在使用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}'
当控制器应该拥有自己的Get等时,为什么会这样做?所以你可以这样做:
/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
}
}
要明确 - 问题是:
为什么在启动网络应用程序后立即收到运行时错误?
get是在不同的控制器上,为什么会有冲突呢?
答案 0 :(得分:18)
控制器无法使用相同的路由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) {
//...
}
}
答案 1 :(得分:7)
从两个控制器上删除“获取操作”名称将解决问题