デフォルトのASP.NET Core MVCテンプレートを使用してプロジェクトを作成しました。 /api/{Controller}
の下にRESTful APIも作成したいと思います。新しいWeb APIコントローラー(標準Web APIコントローラークラステンプレート)を追加しましたが、呼び出すことができません。ページが見つからないというエラーが表示されます。 Startup.csにルートを追加しようとしましたが、何もしません:
app.UseMvc(routes =>
{
routes.MapRoute(name: "default", template: "{controller=Home}/{action=Index}/{id?}");
routes.MapRoute(name: "api", template: "api/{controller=Admin}");
});
編集:
私が言ったように、それはすべてデフォルトのテンプレートです。追加したWeb APIコントローラーは次のとおりです。
[Route("api/[controller]")]
public class AdminController : Controller
{
// GET api/values/5
[HttpGet("{id}")]
public string Get(int id)
{
return "value";
}
// POST api/values
[HttpPost]
public void Post([FromBody]string value)
{
}
// PUT api/values/5
[HttpPut("{id}")]
public void Put(int id, [FromBody]string value)
{
}
// DELETE api/values/5
[HttpDelete("{id}")]
public void Delete(int id)
{
}
}
ASP.NET Coreの最新バージョンv2.0.1(VS2017が必要なバージョン)に更新した後、問題は解決しました。おそらく古いバージョンのバグか欠点だったと思います。
二つのこと。
最初に、規則ベースのルーティングを使用する場合、ルートの競合を回避するために、より一般的なルートの前に、より具体的なルートを配置する必要があります。
app.UseMvc(routes =>
{
routes.MapRoute(name: "api", template: "api/{controller=Admin}");
routes.MapRoute(name: "default", template: "{controller=Home}/{action=Index}/{id?}");
});
第二に、コントローラーで既に属性ルーティングを使用しているため、/api/{Controller}
を受け入れるコントローラーにルートテンプレートがないことを除いて、コントローラーにルーティングできるはずです。
それにはデフォルトルートが必要です
[Route("api/[controller]")]
public class AdminController : Controller {
[HttpGet("")] //Matches GET api/admin <-- Would also work with [HttpGet]
public IActionResult Get() {
return Ok();
}
[HttpGet("{id}")] //Matches GET api/admin/5
public IActionResult Get(int id) {
return Ok("value");
}
//...other code removed for brevity
}
Webapiを.netコアMVCに追加する際にまだ問題がある場合は、クラスの前に_[ApiController]
_および[Route("api/[controller]")]
属性を挿入するだけで問題が解決します。
_[Route("api/[controller]")]
[ApiController]
public class ListController
{ ... }
_
_Startup.cs
_にルートマッピングを追加しなかったが、まだうまく機能しています。使用している.netのバージョンは2.1.402です
名前を「管理者」に設定してみてください
app.UseMvc(routes =>
{
routes.MapRoute(
name: "Admin",
template: "api/{controller=Admin}");
});