Pregunta

He estado jugando con ASP.NET MVC 4 beta y ahora veo dos tipos de controladores: ApiController y Controller.

Estoy un poco confundido sobre en qué situaciones puedo elegir un controlador en particular.

Por ejemplo:Si quiero devolver una vista, entonces tengo que usar ApiController o lo ordinario Controller?Soy consciente de que la API web WCF ahora está integrada con MVC.

Dado que ahora podemos usar ambos controladores, ¿puede alguien indicarnos en qué situaciones elegir el controlador correspondiente?

¿Fue útil?

Solución

Utilice el Controlador para representar sus vistas normales.La acción ApiController solo devuelve datos serializados y enviados al cliente.

aqui esta el link

Cita:

Nota Si ha trabajado con ASP.NET MVC, entonces ya está familiarizado con los controladores.Funcionan de manera similar en Web API, pero los controladores en Web API derivan de la clase ApiController en lugar de la clase Controller.La primera diferencia importante que notará es que las acciones en los controladores de API web no devuelven vistas, sino datos.

Los ApiControllers están especializados en devolver datos.Por ejemplo, se encargan de serializar de forma transparente los datos en el formato solicitado por el cliente.Además, siguen un esquema de enrutamiento diferente de forma predeterminada (como en:asignando URL a acciones), proporcionando una API REST por convención.

Probablemente podría hacer cualquier cosa usando un Controlador en lugar de un ApiController con alguna (?) codificación manual.Al final, ambos controladores se basan en la base ASP.NET.Pero tener una API REST es un requisito tan común hoy en día que WebAPI se creó para simplificar la implementación de dicha API.

Es bastante sencillo decidir entre los dos:Si está escribiendo una aplicación web/Internet/intranet basada en HTML, tal vez con una llamada AJAX ocasional que devuelve json aquí y allá, quédese con MVC/Controller.Si desea proporcionar una interfaz REST/controlada por datos a un sistema, utilice WebAPI.Puede combinar ambos, por supuesto, haciendo que un ApiController atienda llamadas AJAX desde una página MVC.

Para dar un ejemplo del mundo real:Actualmente estoy trabajando con un sistema ERP que proporciona una API REST a sus entidades.Para esta API, WebAPI sería un buen candidato.Al mismo tiempo, el sistema ERP proporciona una aplicación web altamente AJAX que puede utilizar para crear consultas para la API REST.La aplicación web en sí podría implementarse como una aplicación MVC, haciendo uso de WebAPI para recuperar metadatos, etc.

Otros consejos

¿Cuál preferirías escribir y mantener?

ASP.NETMVC

public class TweetsController : Controller {
  // GET: /Tweets/
  [HttpGet]
  public ActionResult Index() {
    return Json(Twitter.GetTweets(), JsonRequestBehavior.AllowGet);
  }
}

API web ASP.NET

public class TweetsController : ApiController {
  // GET: /Api/Tweets/
  public List<Tweet> Get() {
    return Twitter.GetTweets();
  }
}

Me encanta el hecho de que MVC6 de ASP.NET Core fusionó los dos patrones en uno porque a menudo necesito admitir ambos mundos.Si bien es cierto que puedes modificar cualquier MVC estándar Controller (y/o desarrollar el tuyo propio ActionResult clases) para actuar y comportarse como un ApiController, puede resultar muy difícil de mantener y probar:encima de eso tener Controladores métodos que regresan ActionResult mezclado con otros que regresan sin editar/serializados/IHttpActionResult Los datos pueden ser muy confusos desde la perspectiva del desarrollador, especialmente si no está trabajando solo y necesita acelerar a otros desarrolladores con ese enfoque híbrido.

La mejor técnica que he encontrado hasta ahora para minimizar ese problema en las aplicaciones web ASP.NET que no son Core es importar (y configurar adecuadamente) el paquete API web en la aplicación web basada en MVC, para poder 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 mediante NuGet: Microsoft.AspNet.WebApi.Core y Microsoft.AspNet.WebApi.WebHost.
  • Agregue uno o más ApiControllers a su /Controllers/ carpeta.
  • Añade lo 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ás registrar la clase anterior en tu Puesta en marcha clase (ya sea Startup.cs o Global.asax.cs, dependiendo de si estás usando la plantilla de inicio de OWIN o no).

Inicio.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 pros y sus contras, se explica con más detalle en esta publicación Escribí en mi blog.

Cada método en Web API devolverá datos (JSON) sin serialización.

Sin embargo, para devolver datos JSON en controladores MVC, estableceremos el tipo de resultado de acción devuelto en JsonResult y llamaremos al método Json en nuestro objeto para asegurarnos de que esté empaquetado en JSON.

La principal diferencia es:Web API es un servicio para cualquier cliente, cualquier dispositivo, y MVC Controller solo sirve a su cliente.Lo mismo porque es plataforma MVC.

Es bastante sencillo decidir entre los dos:Si está escribiendo una aplicación web/Internet/intranet basada en HTML, tal vez con una llamada AJAX ocasional que devuelve json aquí y allá, quédese con MVC/Controller.Si desea proporcionar una interfaz REST/controlada por datos a un sistema, utilice WebAPI.Puede combinar ambos, por supuesto, haciendo que un ApiController atienda llamadas AJAX desde una página MVC.Básicamente, el controlador se usa para MVC y API-Controller se usa para REST-API que puede usar tanto en el mismo programa que su necesidad

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top