¿Cómo agregar API web a un proyecto de aplicación web ASP.NET MVC 4 existente?

365

Deseo agregar una API web ASP.NET a un proyecto de aplicación web ASP.NET MVC 4, desarrollado en Visual Studio 2012. ¿Qué pasos debo realizar para agregar una API web funcional al proyecto? Soy consciente de que necesito un controlador derivado de ApiController, pero eso es todo lo que sé.

Avíseme si necesito proporcionar más detalles.

aknuds1
fuente

Respuestas:

455

Los pasos que necesitaba realizar eran:

  1. Añadir referencia a System.Web.Http.WebHost.
  2. Agregar App_Start\WebApiConfig.cs(ver fragmento de código a continuación).
  3. Importar espacio System.Web.Httpde nombres en Global.asax.cs.
  4. Llamar WebApiConfig.Register(GlobalConfiguration.Configuration)en MvcApplication.Application_Start()(en archivo Global.asax.cs), antes de registrar la ruta aplicación web por defecto lo que llevaría a tener prioridad.
  5. Agregar un controlador derivado de System.Web.Http.ApiController.

Entonces podría aprender lo suficiente del tutorial (Su primera API web ASP.NET) para definir mi controlador API.

App_Start \ WebApiConfig.cs:

using System.Web.Http;

class WebApiConfig
{
    public static void Register(HttpConfiguration configuration)
    {
        configuration.Routes.MapHttpRoute("API Default", "api/{controller}/{id}",
            new { id = RouteParameter.Optional });
    }
}

Global.asax.cs:

using System.Web.Http;

...

protected void Application_Start()
{
    AreaRegistration.RegisterAllAreas();

    RegisterGlobalFilters(GlobalFilters.Filters);
    WebApiConfig.Register(GlobalConfiguration.Configuration);
    RegisterRoutes(RouteTable.Routes);
    BundleConfig.RegisterBundles(BundleTable.Bundles);
}

Actualización 10.16.2015:

Word lo tiene, el paquete NuGet Microsoft.AspNet.WebApi debe estar instalado para que funcione lo anterior.

aknuds1
fuente
12
Esto fue realmente útil. También tuve que agregar una referencia System.Net.Http, pero aparte de eso, ¡funcionó de maravilla!
Christofer Eliasson
55
También actualicé un proyecto de MVC3 a 4 y también necesitaba agregar una referencia a System.Web.Http.
Damien Sawyer
3
¡Puede usar nuget ahora y estar al tanto de cualquier cambio que ocurra! nuget.org/packages/Microsoft.AspNet.WebApi
Chris
3
No conseguiría que esto funcionara hasta que cambiara mi registro de API web a: GlobalConfiguration.Configure (WebApiConfig.Register);
KingOfHypocrites
3
@LuisGouveia Supongo que es demasiado tarde, pero alguien más probablemente lo resolverá más rápido si esto es lo que tenía. GlobalConfiguration.Configure (WebApiConfig.Register); en Global.asax va antes de RouteConfig.RegisterRoutes (RouteTable.Routes);
Maxim
77

ACTUALIZACIÓN 22/11/2013: este es el último paquete de WebApi:

Install-Package Microsoft.AspNet.WebApi

Respuesta original (este es un paquete anterior de WebApi)

Install-Package AspNetWebApi

Más detalles .

cdeutsch
fuente
3
A partir de 2013, ese es un paquete heredado que desea Install-Package Microsoft.AspNet.WebApiahora. Ver nuget.org/packages/Microsoft.AspNet.WebApi
Chris
70

Para agregar WebAPI en mi proyecto MVC 5.

  1. Abra la consola del administrador de paquetes NuGet y ejecute

    PM> Install-Package Microsoft.AspNet.WebApi
  2. Añadir referencias System.Web.Routing, System.Web.Nety System.Net.Httpdlls si no hay ya

  3. Haga clic derecho en la carpeta de controladores> agregar nuevo elemento> web> Agregar controlador API web

  4. Web.config será modificado en consecuencia por VS

  5. Agregar Application_Startmétodo si no existe

    protected void Application_Start()
    {
        //this should be line #1 in this method
        GlobalConfiguration.Configure(WebApiConfig.Register);
    }
  6. Agregue la siguiente clase (agregué en el archivo global.asax.cs)

    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 }
             );
         }
     }
  7. Modificar el método de la API web en consecuencia

    namespace <Your.NameSpace.Here>
    {
        public class VSController : ApiController
        {
            // GET api/<controller>   : url to use => api/vs
            public string Get()
            {
                return "Hi from web api controller";
            }
    
            // GET api/<controller>/5   : url to use => api/vs/5
            public string Get(int id)
            {
                return (id + 1).ToString();
            }
        }
    }
  8. Reconstruir y probar

  9. Crea una página html simple

    <html xmlns="http://www.w3.org/1999/xhtml">
    <head>
        <title></title>    
        <script src="../<path_to_jquery>/jquery-1.9.1.min.js"></script>
        <script type="text/javascript">
            var uri = '/api/vs';
            $(document).ready(function () {
                $.getJSON(uri)
                .done(function (data) {
                    alert('got: ' + data);
                });
    
                $.ajax({
                    url: '/api/vs/5',
                    async: true,
                    success: function (data) {
                        alert('seccess1');
                        var res = parseInt(data);
                        alert('got res=' + res);
                    }
                });
            });
        </script>
    </head>
    <body>
    ....
    </body>
    </html>
kheya
fuente
El punto que creó una diferencia fue colocar el WebApiconfig.Register en la primera línea, como lo mencionó @kheya
Rajat el
¡Me gustaría agregar que su nombre de controlador de API debe terminar con Controlador , como CarController (no solo Car )! Mucha gente lo olvida y obtiene el mensaje de error "No se encontró ningún tipo que coincida con el controlador llamado {0} '"
1_bug
Para ser más eficiente con esta buena respuesta, puede ignorar los pasos 4, 8 y 9. (no son tan esenciales) Y si cambia el orden de los pasos 5 y 6 tendrán más sentido (es mejor crear una clase que
úsalo
¿Dónde exactamente estamos agregando referencias a System.Web.Routing, System.Web.Net y System.Net.Http?
gabed123
28

Tan pronto como agregue un "Controlador WebApi" en la carpeta de controladores, Visual Studio se ocupa de las dependencias automáticamente;

Visual Studio ha agregado el conjunto completo de dependencias para ASP.NET Web API 2 para proyectar 'MyTestProject'.

El archivo Global.asax.cs en el proyecto puede requerir cambios adicionales para habilitar la API web ASP.NET.

  1. Agregue las siguientes referencias de espacio de nombres:

    usando System.Web.Http; usando System.Web.Routing;

  2. Si el código aún no define un método Application_Start, agregue el siguiente método:

    Vacío protegido Application_Start () {}

  3. Agregue las siguientes líneas al comienzo del método Application_Start:

    GlobalConfiguration.Configure (WebApiConfig.Register);

Teoman shipahi
fuente
Esta es, con mucho, la forma más fácil de lograr esto ahora.
Adam Smith
1
No funciona aqui. 1. Nuget: Install-Package Microsoft.AspNet.WebApi2. Agregue el nuevo elemento "Web API Controller Class (v2.1)". Resultado: agrega el controlador api pero no cambia Application_Start. Con Owin
Artyom
2
esta es la respuesta correcta cuando tiene vs2015: actualice 3 y agregue el controlador web api 2.
ModChowdhury
Lo hizo en 2017, pero tuve que actualizar mis ensambles de WebApi. También tuve que crear la clase WebApiConfig manualmente, docs.microsoft.com/en-us/aspnet/web-api/overview/advanced/…
johnny
22

Puede instalar desde nuget como la imagen de abajo:

ingrese la descripción de la imagen aquí

O ejecute la siguiente línea de comando en la consola de Package Manager:

Install-Package Microsoft.AspNet.WebApi
cuongle
fuente
3
Entonces, ¿qué más debo hacer, excepto agregar el controlador? Es por eso que publiqué esta pregunta en primer lugar, el tutorial realmente no dice ya que supone un proyecto de API web. Agregué un controlador API, pero no está enrutado.
aknuds1
1
El tutorial no fue de mucha ayuda con respecto a agregar una API web a un proyecto existente, así que lo descubrí a partir de un proyecto de API web, como se describe en mi respuesta.
aknuds1
Estoy de acuerdo, parece que esta tubería ya está instalada si usa la plantilla de proyecto de la aplicación web.
Longda
@cuongle: la versión 2.2 de la API web se instalará con mvc 4? ¿es compatible con MVC 4?
Thomas
20

Antes de comenzar a fusionar proyectos de MVC y API web, le sugiero que lea sobre los contras y los profesionales para separarlos como proyectos diferentes. Una cosa muy importante (la mía) son los sistemas de autenticación, que son totalmente diferentes.

SI necesita utilizar solicitudes autenticadas en MVC y API web, debe recordar que la API web es RESTful (no necesita mantener sesión, solicitudes HTTP simples, etc.), pero MVC no.

Para ver las diferencias de las implementaciones, simplemente cree 2 proyectos diferentes en Visual Studio 2013 a partir de plantillas: uno para MVC y otro para API web (no olvide activar "Autenticación individual" durante la creación). Verá mucha diferencia en AuthencationControllers.

Entonces, ten cuidado.

Yarkov Anton
fuente
11

NOTA: esta es solo una abreviatura de esta respuesta anterior

  1. Abra la consola del administrador de paquetes NuGet y ejecute

    PM> Install-Package Microsoft.AspNet.WebApi
  2. Agregar referencias a System.Web.Routing, System.Web.Nety System.Net.Httpdlls si no hay ya

  3. Agregue la siguiente clase

    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 }
             );
         }
     }
  4. Añadir Application_Start método si aún no está allí (en el archivo global.asax.cs)

    protected void Application_Start()
    {
        //this should be line #1 in this method
        GlobalConfiguration.Configure(WebApiConfig.Register);
    }
  5. Haga clic derecho en la carpeta de controladores> agregar nuevo elemento> web> Agregar controlador API web

    namespace <Your.NameSpace.Here>
    {
        public class VSController : ApiController
        {
            // GET api/<controller>   : url to use => api/vs
            public string Get()
            {
                return "Hi from web api controller";
            }  
        }
    }
Hakan Fıstık
fuente
¿Dónde exactamente estamos agregando referencias a System.Web.Routing, System.Web.Net y System.Net.Http?
gabed123
1
Desde el cuadro de diálogo Agregar referencia, abra ese diálogo y busque los nombres de esos conjuntos, existe una gran posibilidad de que ya estén agregados. (pero solo para asegurarse)
Hakan Fıstık
¿Se supone que el método Application_Start es parte de la clase global en Global.asax.cs?
gabed123
Sí, actualicé mi respuesta para demostrar que, para la nota
Hakan Fıstık
1
@HakamFostok Esto me ayudó. ¡Gracias!
csichar
3

La solución anterior funciona perfectamente. Prefiero elegir la opción de API web al seleccionar la plantilla del proyecto como se muestra en la imagen a continuación

Nota: La solución funciona con Visual Studio 2013 o superior. La pregunta original se hizo en 2012 y es 2016, por lo tanto, agregando una solución Visual Studio 2013 o superior.

Plantilla de proyecto que muestra la opción de API web

Sankar Krishnamoorthy
fuente
2
Si está creando un proyecto que involucra API web, sería más fácil elegir la opción de API web. La opción creará todos los archivos necesarios como se menciona en las respuestas anteriores.
Sankar Krishnamoorthy
El problema en cuestión aquí está en Visual Studio 2012 y mvc 4. Aunque su solución está bien, no puede hacerlo de esa manera en VS 2012
netfed
Este es un buen punto y he intentado la solución anterior con VS 2013. Gracias @netfed por señalarlo.
Sankar Krishnamoorthy
Hola a todos, tengo el elemento API funcionando en mi solución MVC, pero por defecto trató de ejecutar la solución como una solución API. Pero quiero que se ejecute como una solución MVC por defecto y luego, si va a la ubicación de la API, etc., ejecute las API. ¿Alguien más ha tenido este problema y ha podido resolverlo? Gracias
Chris Cooper
1

Tuve el mismo problema, la solución fue muy fácil

Haga clic con el botón derecho en Solotion e instale Microsoft.ASP.NET.WebApi desde "Administrar paquete Nuget para Sulotion"

boom eso es todo;)

iDeveloper
fuente