web-dev-qa-db-fra.com

Comment ajouter un contrôleur API Web à un ASP.NET Core MVC existant?

J'ai créé un projet à l'aide du modèle ASP.NET Core MVC par défaut. J'aimerais également créer une API RESTful sous /api/{Controller}. J'ai ajouté un nouveau contrôleur API Web (modèle de classe de contrôleur API Web standard), mais je ne peux pas l'appeler. Je reçois une erreur en disant que la page est introuvable. J'ai essayé d'ajouter un itinéraire dans Startup.cs mais cela ne fait rien:

app.UseMvc(routes =>
{
    routes.MapRoute(name: "default", template: "{controller=Home}/{action=Index}/{id?}");
    routes.MapRoute(name: "api", template: "api/{controller=Admin}");
});

MODIFIER:

Comme je l'ai dit, ce sont tous des modèles par défaut. Voici le contrôleur API Web que j'ai ajouté:

[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)
    {
    }
}
10
Alex G.

Après la mise à jour vers la dernière version d'ASP.NET Core, v2.0.1 (celle qui nécessite VS2017), le problème s'est résolu. Je pense que c'était probablement un bug ou une lacune dans l'ancienne version.

2
Alex G.

Deux choses.

Premièrement, lors de l'utilisation d'un routage basé sur des conventions, des itinéraires plus spécifiques doivent précéder des itinéraires plus génériques afin d'éviter les conflits d'itinéraire.

app.UseMvc(routes =>
{
    routes.MapRoute(name: "api", template: "api/{controller=Admin}");
    routes.MapRoute(name: "default", template: "{controller=Home}/{action=Index}/{id?}");
});

Deuxièmement, vous utilisez déjà le routage d'attribut sur le contrôleur, vous devriez donc pouvoir le router vers le contrôleur, à l'exception du fait que vous n'avez pas de modèle de route sur le contrôleur qui accepterait /api/{Controller}

Cela nécessiterait une route par défaut

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

Essayez de régler le nom sur "Admin"

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

Si quelqu'un a toujours des difficultés à ajouter Webapi à .net core MVC, il suffit d'insérer les attributs [ApiController] et [Route("api/[controller]")] avant que la classe ne résolve le problème:

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

Je n'ai pas ajouté de mappage d'itinéraire dans Startup.cs et fonctionne toujours bien. La version de .net que j'utilise est la 2.1.402

0
Kevin Youn