web-dev-qa-db-fra.com

Quelle est la différence entre MVC Controller et Web API Controller dans ASP.NET MVC 6?

Dans ASP.NET 5 MVC 6, Microsoft a fusionné la classe de contrôleur MVC normale (Controller) avec la classe de contrôleur Web Api (ApiController). Il n'y a maintenant qu'une classe Controller à hériter, qui inclut également les fonctionnalités de WebApi.

Alors maintenant, il n'est pas aussi simple de distinguer les contrôleurs MVC et WebApi. Les deux héritent de la classe Controller. La seule différence que je peux remarquer est que les informations de routage de WebApi sont toujours fournies par les attributs HttpGet, HttpPost, HttpPut et HttpDelete. Mais maintenant, il est possible de faire de même avec les contrôleurs MVC en utilisant le routage d'attributs, juste avec des attributs différents.

Même les fonctionnalités semblent avoir fusionné. Les contrôleurs MVC prennent désormais également en charge la négociation de contenu.

Les questions concrètes sont:

Y a-t-il encore une vraie différence, ou est-ce simplement la façon dont les itinéraires sont spécifiés? De quelle façon est-il désormais préférable de créer des applications Web?

Contrôleur MVC (presque) vide:

public class HomeController : Controller
{
    public List<Person> Index()
    {
        return new List<Person>()
        {
            new Person() {Firstname = "test1", Lastname = "test2"},
            new Person() {Firstname = "test3", Lastname = "test4"}
        };
    }

    public IActionResult About()
    {
        ViewData["Message"] = "Your application description page.";

        return View();
    }

    public IActionResult Contact()
    {
        ViewData["Message"] = "Your contact page.";

        return View();
    }

    public IActionResult Error()
    {
        return View("~/Views/Shared/Error.cshtml");
    }
}

Contrôleur WebApi (presque) vide:

[Route("api/[controller]")]
public class ValuesController : Controller
{
    // GET: api/values
    [HttpGet]
    public IEnumerable<Person> Get()
    {
        return new List<Person>()
        {
            new Person() {Firstname = "test1", Lastname = "test2"},
            new Person() {Firstname = "test3", Lastname = "test4"}
        };
    }

    // 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)
    {
    }
}

MODIFIER:

Si vous souhaitez essayer si la négociation de contenu fonctionne, vous devez inclure ce code dans votre méthode Startup.ConfigureServices, car par défaut, le type de retour est JSON uniquement.

services.Configure<MvcOptions>(options =>
{
    options.AddXmlDataContractSerializerFormatter();
});
27
Domysee

Je pense que vous y réfléchissez trop.

Votre première question "Quelle est la différence entre MVC Controller et Web API Controller dans ASP.NET MVC 6?" suppose qu'ils sont différents, mais ils ne le sont pas. Ils sont fusionnés, il n'y a donc pas de différence.

Si vous souhaitez définir des itinéraires distincts pour délimiter vos méthodes d'action qui ne renvoient pas les résultats d'affichage, alors allez-y. A vous de voir comment organiser votre candidature. Demander "De quelle manière est maintenant la méthode préférée pour créer des applications Web?" est inutile, car c'est à vous de décider de votre application, et il n'y aura pas de façon plus courante de faire les choses tant que MVC 6 n'aura pas été utilisé en production pendant une longue période.

23
mason

Bien que Mason ait parfaitement répondu à la question, je veux fournir des informations supplémentaires sur les différences et certaines ressources qui, espérons-le, aideront les futurs visiteurs de la question.

Microsoft a fusionné ApiController et Controller en une seule classe, Controller. Pour ce faire, ils ont supprimé certaines fonctionnalités de ApiController.

This est un excellent article de blog décrivant les changements.

Par exemple, au lieu de spécifier le HTTP Action en tant que préfixe de la méthode des paramètres et de la route dans un attribut route, les deux sont désormais effectués avec les attributs HttpGet et HttpPost.

[HttpGet("api/visits")]

Si vous souhaitez migrer du projet WebApi, ici est un guide pour le faire.

Si vous ne souhaitez pas migrer, mais souhaitez simplement convertir le projet vers le nouveau ASP.NET MVC version, vous pouvez utiliser le Web API Compatibility Shim. Ici et ici vous trouverez des conseils pour cela.

9
Domysee