Self-Host 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 API web no requiere IIS. Puede hospedar automáticamente una API web en su propio proceso de host.

Las nuevas aplicaciones deben usar OWIN para autoalojar la API web. Consulte Uso de OWIN para Self-Host ASP.NET Web API 2.

Versiones de software usadas en el tutorial

  • API Web 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. Asigne al proyecto el nombre "SelfHost" y haga clic en Aceptar.

Captura de pantalla del cuadro de diálogo Nuevo proyecto que muestra el elemento Visual C# en la lista de carpetas y el elemento Aplicación de Windows Forms, que está resaltado en gris.

Establecer 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 .

Captura de pantalla de la ventana Explorador de soluciones que muestra la lista desplegable Plataforma de destino con el elemento dot NET Framework 4, que está resaltado en azul.

Instalación del Administrador de paquetes NuGet

El Administrador de paquetes NuGet es la manera más fácil de agregar ensamblados de API web a un proyecto de non-ASP.NET.

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

Para 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 , seleccione 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.

Captura de pantalla del cuadro de diálogo Extensiones y actualizaciones que muestra el Administrador de paquetes NuGet en los resultados de búsqueda, que está resaltado en gris.

Adición del paquete NuGet de la API web

Una vez instalado el Administrador de paquetes NuGet, agregue el paquete Self-Host API web 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 está 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 autohospedar de api web ASP.NET 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.

Captura de pantalla del cuadro de diálogo Administrar paquetes NuGet que muestra Microsoft ASP.NET Web API Self Host, el cual está resaltado en azul.

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, consulte el tutorial Introducción . Este controlador define tres acciones GET:

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

Hospedaje de la API web

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

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

Agregue el código 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) Agregar una reserva de un 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:

  • Ejecución de Visual Studio con permisos de administrador elevados 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:

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/

Llamada a la API web desde una aplicación cliente (C#)

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

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

  • En el Explorador de soluciones, haga clic con el botón derecho en la solución y seleccione Agregar nuevo proyecto.
  • Cree una nueva aplicación de consola denominada "ClientApp".

Captura de pantalla del Explorador de soluciones en la que se muestran los elementos de menú contextual Agregar y Nuevo proyecto, que está resaltado en blanco.

Use el Administrador de paquetes NuGet para agregar el paquete de bibliotecas principales de api web de ASP.NET:

  • En el menú Herramientas, seleccione Administrador 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.Client".
  • Seleccione el paquete de las bibliotecas del cliente de la API Web de Microsoft ASP.NET 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 , en Solución, seleccione Proyectos.
  • Seleccione el proyecto SelfHost.
  • Haz clic en Aceptar.

Captura de pantalla del cuadro de diálogo Administrador de referencias que muestra el proyecto Self Host, que está resaltado con un cuadro azul.

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

using System.Net.Http;

Agregue una instancia httpClient estática:

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 objetos Task 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 API web 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.

Captura de pantalla de la ventana de la consola en la que se muestra una lista de productos resultantes asociados a I D y categorías.