wake-up-neo.com

Was ist der Unterschied zwischen MVC Controller und Web API Controller in ASP.NET MVC 6?

In ASP.NET 5 MVC 6 hat Microsoft die normale MVC-Controller-Klasse (Controller) mit der Web-API-Controller-Klasse (ApiController) zusammengeführt. Jetzt gibt es nur noch eine Controller -Klasse, von der geerbt werden kann und die auch die Funktionen von WebApi enthält.

Daher ist es jetzt nicht so einfach, MVC- und WebApi-Controller zu unterscheiden. Beide erben von der Klasse Controller. Der einzige Unterschied, den ich feststellen kann, ist, dass die Routing-Informationen von WebApi immer noch durch die Attribute HttpGet, HttpPost, HttpPut und HttpDelete bereitgestellt werden. Jetzt ist es jedoch möglich, dasselbe mit MVC-Controllern mithilfe des Attributroutings zu tun, nur mit unterschiedlichen Attributen.

Sogar die Funktionen scheinen zusammengewachsen zu sein. MVC-Controller unterstützen jetzt auch die Aushandlung von Inhalten.

Die konkreten Fragen sind:

Gibt es noch einen wirklichen Unterschied, oder ist es nur die Art und Weise, wie die Routen angegeben werden? Welcher Weg ist jetzt der bevorzugte, um Web-Apps zu erstellen?

(Fast) leerer MVC-Controller:

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");
    }
}

(Fast) leerer WebApi-Controller:

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

EDIT:

Wenn Sie versuchen möchten, ob die Inhaltsaushandlung funktioniert, müssen Sie diesen Code in Ihre Methode Startup.ConfigureServices aufnehmen, da der Rückgabetyp standardmäßig nur JSON ist.

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

Ich denke, Sie denken zu viel darüber nach.

Ihre erste Frage "Was ist der Unterschied zwischen MVC Controller und Web API Controller in ASP.NET MVC 6?" setzt voraus, dass sie unterschiedlich sind, aber nicht. Sie werden zusammengeführt, es gibt also keinen Unterschied.

Wenn Sie separate Routen definieren möchten, um Ihre Aktionsmethoden abzusperren, die keine View-Ergebnisse zurückgeben, wählen Sie diese aus. Es liegt an Ihnen, wie Sie Ihre Bewerbung organisieren. Fragen: "Welcher Weg ist jetzt der bevorzugte, um Web-Apps zu erstellen?" Dies ist sinnlos, da Sie selbst entscheiden müssen, welche Anwendung Sie verwenden möchten. Eine häufigere Vorgehensweise wird es erst geben, wenn MVC 6 über einen längeren Zeitraum in der Produktion eingesetzt wurde.

23
mason

Während Mason die Frage perfekt beantwortete, möchte ich einige zusätzliche Informationen zu den Unterschieden und einige Ressourcen bereitstellen, die hoffentlich zukünftigen Besuchern der Frage helfen werden.

Microsoft hat ApiController und Controller in einer Klasse zusammengefasst, Controller. Zu diesem Zweck haben sie einige Features von ApiController entfernt.

This ist ein großartiger Blog-Beitrag, der die Änderungen beschreibt.

Anstatt beispielsweise HTTP Action Als Präfix der Parametermethode und der Route in einem Routenattribut anzugeben, werden jetzt beide mit den Attributen HttpGet und HttpPost ausgeführt.

[HttpGet("api/visits")]

Wenn Sie aus dem Projekt WebApi migrieren möchten, ist hier eine Anleitung, um dies zu tun.

Wenn Sie nicht migrieren möchten, sondern nur das Projekt in die neue Version ASP.NET MVC Konvertieren möchten, können Sie Web API Compatibility Shim Verwenden. hier und hier finden Sie Anleitung dafür.

9
Domysee