with webapi started route net mvc attribute asp apicontroller asp.net .net asp.net-mvc wcf-web-api

asp.net - webapi - web api rest c#



¿Puedo tener tanto un Controlador como un ApiController para la misma cosa? (3)

Para quienes buscan orientación paso a paso sobre cómo hacer esto en el proyecto WebApi:

  1. Cree dos carpetas / espacios de nombres, a saber: ControllersApi y ControllersWeb
  2. Haga clic derecho en ControllersWeb y vaya a Add -> Controller y seleccione MVC 5 Controller - Empty . Esto agregará todas las demás dependencias si no las tenía en su proyecto WebApi.
  3. Su RouteConfig ahora registrará aquellas clases que heredan de la clase base del Controller . Es probable que tenga que agregar un enlace al controlador predeterminado, editando los valores predeterminados para que diga: defaults: new { action = "Index", controller = "Home", id = UrlParameter.Optional }

Eso es todo, ahora puede ejecutar el sitio y usar tanto API como los controladores web.

Acabo de comenzar a usar el VS 2012 RC y estoy creando una aplicación web ASP.NET MVC 4 en la que planeo proporcionar una interfaz de usuario basada en HTML y una interfaz de programación basada en WebApi.

Para mi sitio web HTML, tengo un controlador y una vista para cada uno de mis modelos (MVC!), Y el enrutamiento funciona "por convención", de modo que, por ejemplo, la URL /client conecta a mi ClientController . My ClientController deriva de Controller .

Para mi API, crearé nuevos controladores que se deriven de ApiController . Naturalmente quiero que las URL de mi API sean similares a las URL de HTML, por lo que me gustaría que la información del cliente esté disponible en /api/client . Sin embargo, con el enrutamiento por convención, eso sugeriría que necesito un ApiController llamado ClientController . Y ya tengo una clase ClientController .

¿Cómo trato con esto? ¿Necesito enrutamiento personalizado? ¿Pongo las clases de API en diferentes espacios de nombres para poder darles el mismo nombre?

Actualización: esta pregunta parece sugerir que todo lo que necesito es un espacio de nombres diferente para mis controladores API: mezclar los controladores de api web y los controladores de sitio


Puede echar un vistazo a la siguiente publicación del blog que ilustra cómo un controlador Api podría servir también para las vistas de Razor. Básicamente, usa el RazorEngine de Razor para analizar el punto de vista de Razor y servirlo.


Todo lo que requiere es que las clases del controlador estén en un espacio de nombres diferente, y todo está bien.

El uso de áreas MVC también funcionaría (como se sugiere en el comentario de gordonml), pero esto coloca a los controladores en diferentes espacios de nombres, por lo que es una forma más formal de lograr el mismo resultado.