Nota:
El acceso a esta página requiere autorización. Puede intentar iniciar sesión o cambiar directorios.
El acceso a esta página requiere autorización. Puede intentar cambiar los directorios.
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.
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 Sí.
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:
- Inicie Visual Studio.
- En el menú Herramientas , seleccione Extensiones y actualizaciones.
- En el cuadro de diálogo Extensiones y actualizaciones , seleccione En línea.
- Si no ve "Administrador de paquetes NuGet", escriba "administrador de paquetes nuget" en el cuadro de búsqueda.
- Seleccione el Administrador de paquetes NuGet y haga clic en Descargar.
- Una vez completada la descarga, se le pedirá que lo instale.
- Una vez completada la instalación, es posible que se le pida que reinicie Visual Studio.
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.
- 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.
- Seleccione Administrar paquetes NuGet para la solución.
- En el cuadro de diálogo Administrar paquetes NugGet , seleccione En línea.
- En el cuadro de búsqueda, escriba "Microsoft.AspNet.WebApi.SelfHost".
- Seleccione el paquete autohospedar de api web ASP.NET y haga clic en Instalar.
- 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.
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".
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.
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:
- Llame a HttpClient.GetAsync para enviar una solicitud GET al URI adecuado.
- Llame a HttpResponseMessage.EnsureSuccessStatusCode. Este método produce una excepción si el estado de la respuesta HTTP es un código de error.
- 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.