2015-09-02 7 views
22

In ASP.NET 5 MVC 6 Microsoft ha unito la classe del controller MVC normale (Controller) con la classe del controller Web Api (ApiController). Ora c'è solo una classe Controller da cui ereditare, che include anche le funzionalità di WebApi.Qual è la differenza tra MVC Controller e Web API Controller in ASP.NET MVC 6?

Così ora non è così semplice distinguere i controller MVC e WebApi. Entrambi ereditano dalla classe Controller. L'unica differenza che posso individuare è che le informazioni di routing di WebApi sono ancora fornite dagli attributi HttpGet, HttpPost, HttpPut e HttpDelete. Ma ora è possibile fare lo stesso con i controller MVC utilizzando il routing degli attributi, solo con attributi diversi.

Anche le funzionalità sembrano essersi unite. I controller MVC supportano ora anche la negoziazione del contenuto.

Le domande concrete sono:

C'è ancora una differenza reale, o è solo il modo in cui vengono specificati i percorsi? Qual è il modo preferito per creare app web?

(quasi) vuoto di controllo MVC:

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

(quasi) del controller WebAPI vuoto:

[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:

Se volete provare se la negoziazione dei contenuti funziona, devi includere questo codice nel tuo metodo Startup.ConfigureServices, perché per impostazione predefinita il tipo restituito è solo JSON.

services.Configure<MvcOptions>(options => 
{ 
    options.AddXmlDataContractSerializerFormatter(); 
}); 
+0

@Will In MVC 6 non esiste una classe 'ApiController', sono stati uniti nella classe' Controller'. Questo è esattamente ciò che ottieni se crei un controller WebApi con Visual Studio – Domysee

+0

Bene, suppongo di dover esaminare MVC6:/ – Will

+0

Sì, molte modifiche interessanti si sono verificate lì – Domysee

risposta

17

Penso che ci stiate pensando troppo.

La tua prima domanda "Qual è la differenza tra Controller MVC e controller API Web in ASP.NET MVC 6?" presuppone che siano diversi, ma non lo sono. Sono uniti, quindi non c'è differenza.

Se si desidera definire percorsi separati per separare i metodi di azione che non restituiscono Visualizza risultati, quindi andare per esso. Spetta a te come organizzare la tua applicazione. Chiedendo "Qual è il modo preferito per creare app web?" è inutile, dato che spetta a te decidere per la tua applicazione, e non ci sarà un modo più comune di fare le cose fino a dopo che MVC 6 sarà stato in produzione per un bel po 'di tempo.

+0

Ho pensato anche a questo, ci sono ancora 2 modelli diversi in Visual Studio. Uno per controller MVC e uno per controller WebApi. Quindi ho concluso che deve esserci una differenza da qualche parte – Domysee

+0

@Dominik Penso che la tua conclusione non sia stata completamente pensata. Il modello è probabilmente lì per comodità, in modo che gli sviluppatori provenienti da una vecchia versione non vadano persi quando vogliono funzionalità API Web in un'app MVC 6. – mason

+0

questo ha un senso. Sono ancora un po 'confuso perché Microsoft includa 2 meccanismi diversi per la stessa cosa. È una nuova versione dopotutto, quindi potrebbero semplicemente rimuovere una via a favore dell'altro. – Domysee

6

Mentre mason ha risposto alla domanda perfettamente, desidero fornire alcune informazioni aggiuntive sulle differenze e alcune risorse che si spera possano aiutare i futuri visitatori della domanda.

Microsoft ha unito ApiController e Controller in una classe, Controller. Per fare ciò, hanno rimosso alcune funzionalità di ApiController.

This è un ottimo post sul blog che descrive i cambiamenti.

Ad esempio, invece di specificare il HTTP Action come prefisso del metodo parametro e il percorso in un attributo percorso, entrambi sono ora fatto con gli attributi HttpGet e HttpPost.

[HttpGet("api/visits")] 

Se si vuole migrare da WebApi progetto, here è una guida per farlo.

Se non si desidera eseguire la migrazione, ma si desidera semplicemente convertire il progetto nella nuova versione ASP.NET MVC, è possibile utilizzare lo Web API Compatibility Shim. Here e here trovi una guida per questo.