web-dev-qa-db-ja.com

WebAPIコアルーティングの問題

だから、私は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は異なるコントローラー上にあるので、なぜ競合が発生するのでしょうか?

18
Ahmed ilyas

コントローラーは同じ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) {
        //...
    }
}
25
Nkosi

両方のコントローラーからgetアクションで名前を削除すると、問題が解決します

7
fmalh3iro