Me encanta el hecho de que MVC6 de ASP.NET Core fusionó los dos patrones en uno solo porque a menudo necesito admitir ambos mundos. Si bien es cierto que puede ajustar cualquier MVC estándar Controller
(y / o desarrollar sus propias ActionResult
clases) para actuar y comportarse de la misma manera ApiController
, puede ser muy difícil de mantener y probar: además de eso, hacer que los métodos de los Controladores regresen ActionResult
mezclados con otros volviendo crudo / serializado /IHttpActionResult
puede ser muy confuso desde la perspectiva del desarrollador, especialmente si no está trabajando solo y necesita que otros desarrolladores aceleren con ese enfoque híbrido.
La mejor técnica que he llegado hasta ahora para minimizar ese problema en las aplicaciones web no principales de ASP.NET es importar (y configurar correctamente) el paquete de API web en la aplicación web basada en MVC, para que pueda tener lo mejor de ambos mundos: Controllers
para Vistas, ApiControllers
para datos.
Para hacer eso, debe hacer lo siguiente:
- Instale los siguientes paquetes de API web con NuGet:
Microsoft.AspNet.WebApi.Core
y Microsoft.AspNet.WebApi.WebHost
.
- Agregue uno o más ApiControllers a su
/Controllers/
carpeta.
- Agregue el siguiente WebApiConfig.cs archivo a su
/App_Config/
carpeta:
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 }
);
}
}
Finalmente, deberá registrar la clase anterior en su clase de inicio (ya sea Startup.cs
o Global.asax.cs
, dependiendo de si está utilizando la plantilla de inicio de OWIN o no).
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);
// ...
}
Este enfoque, junto con sus ventajas y desventajas, se explica con más detalle en esta publicación que escribí en mi blog.
ApiController
y,Controller
por lo tanto, si está utilizando el .NET más nuevo, ya no tendrá que preocuparse por ApiController: docs.microsoft.com/en-us/aspnet/core/tutorials/first-web- api