Prueba interna de ASP.NET Web API 1 (C#)

de Mike Wasson

En este tutorial se muestra cómo hospedar una API web dentro de una aplicación de consola. ASP.NET Web API no requiere IIS. Puede hospedar automáticamente una API web en su propio proceso de host.

Las nuevas aplicaciones deben usar OWIN para autohospedar la Web API. Usar OWIN para autohospedar ASP.NET Web API 2

Versiones de software usadas en el tutorial

  • Web API 1
  • Visual Studio 2012

Creación del proyecto de aplicación de consola

Inicie Visual Studio y seleccione Nuevo proyecto en la página Inicio. O bien, en el menú Archivo, seleccione Nuevo y, a continuación, Proyecto.

En el panel Plantillas, seleccione Plantillas instaladas y expanda el nodo Visual C#. En Visual C#, seleccione Windows. En la lista de plantillas de proyecto, seleccione Aplicación de consola. Llame al proyecto "SelfHost" y haga clic en Aceptar.

Screenshot of the New Project dialog box showing the Visual C# item in the folder list and the Windows Forms Application item, which is highlighted in gray.

Establezca la Plataforma de destino (Visual Studio 2010)

Si usa Visual Studio 2010, cambie la plataforma de destino a .NET Framework 4.0. (De forma predeterminada, la plantilla de proyecto tiene como destino el perfil de cliente de .Net Framework).

En el Explorador de soluciones, haga clic con el botón derecho en el proyecto y seleccione Propiedades. En la lista desplegable Plataforma de destino, cambie la plataforma de destino a .NET Framework 4.0. Cuando se le pida que aplique el cambio, haga clic en .

Screenshot of the Solution Explorer window showing the Target Framework dropdown list with the dot NET Framework 4 item, which is highlighted in blue.

Instalar el Administrador de paquetes NuGet

El Administrador de paquetes NuGet es la manera más fácil de agregar ensamblados de Web API a un proyecto que no sea de ASP.NET.

Para comprobar si el Administrador de paquetes NuGet está instalado, haga clic en el menú Herramientas en Visual Studio. Si ve un elemento de menú llamado Administrador de paquetes NuGet, tiene Administrador de paquetes NuGet.

Instalar el Administrador de paquetes NuGet:

  1. Inicie Visual Studio.
  2. En el menú Herramientas, seleccione Extensiones y actualizaciones.
  3. En el cuadro de diálogo Extensiones y actualizaciones, busque En línea.
  4. Si no ve "Administrador de paquetes NuGet", escriba "administrador de paquetes nuget" en el cuadro de búsqueda.
  5. Seleccione el Administrador de paquetes NuGet y haga clic en Descargar.
  6. Una vez completada la descarga, se le pedirá que lo instale.
  7. Una vez completada la instalación, es posible que se le pida que reinicie Visual Studio.

Screenshot of the Extensions and Updates dialog box showing NuGet Package Manager in the search results, which is highlighted in gray.

Adición del paquete NuGet de la Web API

Después de instalar Administrador de paquetes NuGet, agregue el paquete autohospedado de Web API al proyecto.

  1. En el menú Herramientas, seleccione Administrador de paquetes NuGet. Nota: Si no ve este elemento de menú, asegúrese de que el Administrador de paquetes NuGet instalado correctamente.
  2. Seleccione Administrar paquetes NuGet para la solución
  3. En el cuadro de diálogo Administrar paquetes NugGet, seleccione En línea.
  4. En el cuadro de búsqueda, escriba "Microsoft.AspNet.WebApi.SelfHost".
  5. Seleccione el paquete autohospedado ASP.NET Web API y haga clic en Instalar.
  6. Después de instalar el paquete, haga clic en Cerrar para cerrar el cuadro de diálogo.

Nota:

Asegúrese de instalar el paquete denominado Microsoft.AspNet.WebApi.SelfHost, no AspNetWebApi.SelfHost.

Screenshot of the Manage NuGet Packages dialog box showing Microsoft A S P dot Net Web A P I Self Host, which is highlighted in blue.

Crear el modelo y el controlador

En este tutorial se usan las mismas clases de modelo y controlador que el tutorial Introducción.

Agregue una clase pública denominada Product.

namespace SelfHost
{
    public class Product
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public string Category { get; set; }
        public decimal Price { get; set; }
    }
}

Agregue una clase pública denominada ProductsController. Derive esta clase de System.Web.Http.ApiController.

namespace SelfHost
{
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Net;
    using System.Web.Http;
    
    public class ProductsController : ApiController
    {
        Product[] products = new Product[]  
        {  
            new Product { Id = 1, Name = "Tomato Soup", Category = "Groceries", Price = 1 },  
            new Product { Id = 2, Name = "Yo-yo", Category = "Toys", Price = 3.75M },  
            new Product { Id = 3, Name = "Hammer", Category = "Hardware", Price = 16.99M }  
        };

        public IEnumerable<Product> GetAllProducts()
        {
            return products;
        }

        public Product GetProductById(int id)
        {
            var product = products.FirstOrDefault((p) => p.Id == id);
            if (product == null)
            {
                throw new HttpResponseException(HttpStatusCode.NotFound);
            }
            return product;
        }

        public IEnumerable<Product> GetProductsByCategory(string category)
        {
            return products.Where(p => string.Equals(p.Category, category,
                    StringComparison.OrdinalIgnoreCase));
        }
    }
}

Para obtener más información sobre el código de este controlador, vea el tutorial Introducción. Este controlador define tres acciones GET:

URI Descripción
/api/products Permite obtener una lista de todos los productos.
/api/products/id Busca un producto por identificador.
/api/products/?category=category Obtenga una lista de productos por categoría.

Prueba de la Web API

Abra el archivo Program.cs y agregue las siguientes instrucciones using:

using System.Web.Http;
using System.Web.Http.SelfHost;

Agregue el método siguiente a la clase Program.

var config = new HttpSelfHostConfiguration("http://localhost:8080");

config.Routes.MapHttpRoute(
    "API Default", "api/{controller}/{id}", 
    new { id = RouteParameter.Optional });

using (HttpSelfHostServer server = new HttpSelfHostServer(config))
{
    server.OpenAsync().Wait();
    Console.WriteLine("Press Enter to quit.");
    Console.ReadLine();
}

(Opcional) Adición de una reserva de espacio de nombres de URL HTTP

Esta aplicación escucha a http://localhost:8080/. De forma predeterminada, escuchar en una dirección HTTP determinada requiere privilegios de administrador. Al ejecutar el tutorial, por lo tanto, puede obtener este error: "HTTP no pudo registrar la dirección URL http://+:8080/". Hay dos maneras de evitar este error:

  • Ejecute Visual Studio con permisos administrativos o
  • Use Netsh.exe para conceder a su cuenta permisos para reservar la dirección URL.

Para usar Netsh.exe, abra un símbolo del sistema con privilegios de administrador y escriba el siguiente comando:following command:

netsh http add urlacl url=http://+:8080/ user=machine\username

donde machine\username es su cuenta de usuario.

Cuando haya terminado de autohospedar, asegúrese de eliminar la reserva:

netsh http delete urlacl url=http://+:8080/

Llamar a la Web API desde una aplicación cliente (C#)

Vamos a escribir una aplicación de consola sencilla que llama a la Web API.

Agregue un nuevo proyecto de aplicación de consola a la solución:

  • En el Explorador de soluciones, haga clic derecho y seleccioneAgregar nuevo proyecto.
  • Cree una aplicación de consola llamada "ClientApp".

Screenshot of the Solution Explorer showing the right-click menu items Add and New Project, which is highlighted in white.

Use Administrador de paquetes NuGet para agregar el paquete de bibliotecas principales de ASP.NET Web API Core:

  • En el menú de Herramientas, seleccioneAdministrador de paquetes NuGet.
  • Seleccione Administrar paquetes NuGet para la solución
  • En el cuadro de diálogo Administrar paquetes NuGet, seleccione En línea.
  • En el cuadro de búsqueda, escriba "Microsoft.AspNet.WebApi.SelfHost".
  • Seleccione el paquete de bibliotecas de cliente de Microsoft ASP.NET Web API y haga clic en Instalar.

Agregue una referencia en ClientApp al proyecto SelfHost:

  • En el Explorador de soluciones, haga clic con el botón derecho en el proyecto ClientApp.
  • Seleccione Agregar referencia.
  • En el cuadro de diálogo Administrador de referencias, bajo Solución, seleccione Proyectos.
  • Seleccione el proyecto SelfHost.
  • Haga clic en OK.

Screenshot of the Reference Manager dialog box showing the Self Host project, which is highlighted with a blue box.

Abra el archivo Client/Program.cs. Agregue la siguiente instrucción using :

using System.Net.Http;

Agregue una instancia estáticaHttpClient:

namespace Client
{
    class Program
    {
        static HttpClient client = new HttpClient();
    }
}

Agregue los métodos siguientes para enumerar todos los productos, enumerar un producto por identificador y enumerar los productos por categoría.

static void ListAllProducts()
{
    HttpResponseMessage resp = client.GetAsync("api/products").Result;
    resp.EnsureSuccessStatusCode();

    var products = resp.Content.ReadAsAsync<IEnumerable<SelfHost.Product>>().Result;
    foreach (var p in products)
    {
        Console.WriteLine("{0} {1} {2} ({3})", p.Id, p.Name, p.Price, p.Category);
    }
}

static void ListProduct(int id)
{
    var resp = client.GetAsync(string.Format("api/products/{0}", id)).Result;
    resp.EnsureSuccessStatusCode();

    var product = resp.Content.ReadAsAsync<SelfHost.Product>().Result;
    Console.WriteLine("ID {0}: {1}", id, product.Name);
}

static void ListProducts(string category)
{
    Console.WriteLine("Products in '{0}':", category);

    string query = string.Format("api/products?category={0}", category);

    var resp = client.GetAsync(query).Result;
    resp.EnsureSuccessStatusCode();

    var products = resp.Content.ReadAsAsync<IEnumerable<SelfHost.Product>>().Result;
    foreach (var product in products)
    {
        Console.WriteLine(product.Name);
    }
}

Cada uno de estos métodos sigue el mismo patrón:

  1. Llame a HttpClient.GetAsync para enviar una solicitud GET al URI adecuado.
  2. Llame a HttpResponseMessage.EnsureSuccessStatusCode. Este método produce una excepción si el estado de la respuesta HTTP es un código de error.
  3. Llame a ReadAsAsync<T> para deserializar un tipo CLR de la respuesta HTTP. Este método es un método de extensión, definido en System.Net.Http.HttpContentExtensions.

Los métodos GetAsync y ReadAsAsync son asincrónicos. Devuelven los objetos Tarea que representan la operación asincrónica. Obtener la propiedad Result bloquea el subproceso hasta que se completa la operación.

Para obtener más información sobre el uso de HttpClient, incluido cómo realizar llamadas sin bloqueo, consulte Llamada a una Web API desde un cliente .NET.

Antes de llamar a estos métodos, establezca la propiedad BaseAddress en la instancia HttpClient en "http://localhost:8080". Por ejemplo:

static void Main(string[] args)
{
    client.BaseAddress = new Uri("http://localhost:8080");

    ListAllProducts();
    ListProduct(1);
    ListProducts("toys");

    Console.WriteLine("Press Enter to quit.");
    Console.ReadLine();
}

Esto debería generar lo siguiente. (Recuerde ejecutar primero la aplicación SelfHost).

1 Tomato Soup 1.0 (Groceries)
2 Yo-yo 3.75 (Toys)
3 Hammer 16.99 (Hardware)
ID 1: Tomato Soup
Products in 'toys':
Yo-yo
Press Enter to quit.

Screenshot of the console window showing an outputted list of products associated with I D and categories.