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?