web-dev-qa-db-ja.com

Web APIコントローラーを既存のASP.NET Core MVCに追加する方法は?

デフォルトの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)
    {
    }
}
15
Alex G.

ASP.NET Coreの最新バージョンv2.0.1(VS2017が必要なバージョン)に更新した後、問題は解決しました。おそらく古いバージョンのバグか欠点だったと思います。

2
Alex G.

二つのこと。

最初に、規則ベースのルーティングを使用する場合、ルートの競合を回避するために、より一般的なルートの前に、より具体的なルートを配置する必要があります。

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
}
7
Nkosi

Webapiを.netコアMVCに追加する際にまだ問題がある場合は、クラスの前に_[ApiController]_および[Route("api/[controller]")]属性を挿入するだけで問題が解決します。

_[Route("api/[controller]")]
[ApiController]
public class ListController
{ ... }
_

_Startup.cs_にルートマッピングを追加しなかったが、まだうまく機能しています。使用している.netのバージョンは2.1.402です

1
Kevin Youn

名前を「管理者」に設定してみてください

        app.UseMvc(routes =>
        {
            routes.MapRoute(
                name: "Admin",
                template: "api/{controller=Admin}");
        });
0
William Han