だから、私はWeb API(ASP.NET Core 2)で遊んでいて、ルーティングの問題を抱えています。
次のようないくつかのコントローラーがあります。
SchoolController
TeacherController。
両方にGetがあります: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
}
}
明確にするために-質問は:
Webアプリを起動するとすぐにランタイムエラーが発生するのはなぜですか?
Getは異なるコントローラー上にあるので、なぜ競合が発生するのでしょうか?
コントローラーは同じ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) {
//...
}
}
両方のコントローラーからgetアクションで名前を削除すると、問題が解決します