Adoro il fatto che MVC6 di ASP.NET Core abbia unito i due pattern in uno solo perché spesso ho bisogno di supportare entrambi i mondi. Mentre è vero che puoi modificare qualsiasi MVC standard Controller
(e / o sviluppare le tue ActionResult
classi) per agire e comportarsi come un semplice ApiController
, può essere molto difficile da mantenere e testare: inoltre, i metodi di Controller tornano ActionResult
mescolati con altri la restituzione di dati grezzi / serializzati / IHttpActionResult
può essere molto confusa dal punto di vista dello sviluppatore, specialmente se non stai lavorando da solo e hai bisogno di portare altri sviluppatori ad accelerare con quell'approccio ibrido.
La migliore tecnica con cui sono arrivato finora per ridurre al minimo tale problema nelle applicazioni Web non core ASP.NET consiste nell'importare (e configurare correttamente) il pacchetto API Web nell'applicazione Web basata su MVC, quindi posso avere il meglio di entrambi mondi: Controllers
per Views, ApiControllers
per dati.
Per fare ciò, devi fare quanto segue:
- Installa i seguenti pacchetti API Web usando NuGet:
Microsoft.AspNet.WebApi.Core
e Microsoft.AspNet.WebApi.WebHost
.
- Aggiungi uno o più ApiController alla tua
/Controllers/
cartella.
- Aggiungi il seguente file WebApiConfig.cs alla tua
/App_Config/
cartella:
using System.Web.Http;
public static class WebApiConfig
{
public static void Register(HttpConfiguration config)
{
// Web API routes
config.MapHttpAttributeRoutes();
config.Routes.MapHttpRoute(
name: "DefaultApi",
routeTemplate: "api/{controller}/{id}",
defaults: new { id = RouteParameter.Optional }
);
}
}
Infine, dovrai registrare la classe sopra nella tua classe di avvio ( Startup.cs
o Global.asax.cs
, a seconda che tu stia utilizzando o meno il modello di avvio OWIN).
Startup.cs
public void Configuration(IAppBuilder app)
{
// Register Web API routing support before anything else
GlobalConfiguration.Configure(WebApiConfig.Register);
// The rest of your file goes there
// ...
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
ConfigureAuth(app);
// ...
}
Global.asax.cs
protected void Application_Start()
{
// Register Web API routing support before anything else
GlobalConfiguration.Configure(WebApiConfig.Register);
// The rest of your file goes there
// ...
AreaRegistration.RegisterAllAreas();
FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);
RouteConfig.RegisterRoutes(RouteTable.Routes);
BundleConfig.RegisterBundles(BundleTable.Bundles);
// ...
}
Questo approccio - insieme ai suoi pro e contro - è ulteriormente spiegato in questo post che ho scritto sul mio blog.
ApiController
eController
quindi se stai utilizzando .NET più recente non devi più preoccuparti di ApiController - docs.microsoft.com/en-us/aspnet/core/tutorials/first-web- api