C# WebAPI核心路由问题

C# WebAPI核心路由问题,c#,asp.net-core,.net-core,asp.net-core-webapi,asp.net-core-routing,C#,Asp.net Core,.net Core,Asp.net Core Webapi,Asp.net Core Routing,因此,我正在使用Web API(ASP.NET Core 2)并遇到路由问题 我有几个控制器,例如: 学校管理员 教师控制器 两者都有Get:Get(int-id) 问题是,当我运行它时,甚至在实际能够调用这些方法之前,我都会遇到运行时错误 具有相同名称“Get”的属性路由必须具有相同的模板: 操作:MyProject.WebAPI.Controllers.SchoolController.Get(MyProject.WebAPI)'-Template:'api/school/{id}' 操作:

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

我有几个控制器,例如:

学校管理员
教师控制器

两者都有Get:
Get(int-id)

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

具有相同名称“Get”的属性路由必须具有相同的模板: 操作:MyProject.WebAPI.Controllers.SchoolController.Get(MyProject.WebAPI)'-Template:'api/school/{id}' 操作: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
    }
}
澄清一下,问题是:

  • 为什么web应用一启动就出现运行时错误

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


控制器不能使用相同的路由
名称执行操作。它们必须是唯一的,以便路由表能够区分它们

参考文献

路由名称可用于基于特定路由生成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) {
        //...
    }
}

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

对……您不能像在控制器中那样使用相同的
名称进行操作。太好了。非常感谢。固定的!我想知道是否有两个不同的控制器类,为什么.NETCore不允许相同的操作名-Get()?Thanks@Cheung因为它们最终位于同一路由表中,所以名称必须是唯一的。即使是在另一个控制器中,我在使用dotnet aspnet codegenerator脚手架时也遇到了这个问题。生成的代码向HttpGet添加Name属性。删除Name属性解决了这个问题。但是Name对于在CreatedAtRoute(nameof(GetTeacherAsync),new{},res)响应中使用很有用