Self-Host ASP.NET Web API 1 (C#)
por Mike Wasson
Este tutorial mostra como hospedar uma API Web dentro de um aplicativo de console. ASP.NET Web API não requer IIS. Você pode auto-hospedar uma API Web em seu próprio processo de host.
Novos aplicativos devem usar o OWIN para auto-hospedar a API Web. Consulte Usar o OWIN para Self-Host ASP.NET Web API 2.
Versões de software usadas no tutorial
- API Web 1
- Visual Studio 2012
Criar o projeto de aplicativo de console
Inicie o Visual Studio e selecione Novo Projeto na página Iniciar . Ou, no menu Arquivo , selecione Novo e Projeto.
No painel Modelos , selecione Modelos Instalados e expanda o nó Visual C #. Em Visual C#, selecione Windows. Na lista de modelos de projeto, selecione Aplicativo de Console. Nomeie o projeto como "SelfHost" e clique em OK.
Definir a Estrutura de Destino (Visual Studio 2010)
Se você estiver usando o Visual Studio 2010, altere a estrutura de destino para .NET Framework 4.0. (Por padrão, o modelo de projeto tem como destino o Perfil de Cliente do .Net Framework.)
Em Gerenciador de Soluções, clique com o botão direito do mouse no projeto e selecione Propriedades. Na lista suspensa Estrutura de destino, altere a estrutura de destino para .NET Framework 4.0. Quando solicitado a aplicar a alteração, clique em Sim.
Instalar o Gerenciador de Pacotes NuGet
O Gerenciador de Pacotes NuGet é a maneira mais fácil de adicionar os assemblies de API Web a um projeto de non-ASP.NET.
Para marcar se o Gerenciador de Pacotes NuGet estiver instalado, clique no menu Ferramentas no Visual Studio. Se você vir um item de menu chamado Gerenciador de Pacotes NuGet, terá o Gerenciador de Pacotes NuGet.
Para instalar o Gerenciador de Pacotes NuGet:
- Inicie o Visual Studio.
- No menu Ferramentas, selecione Extensões e atualizações.
- Na caixa de diálogo Extensões e Atualizações, selecione Online.
- Se você não vir "Gerenciador de Pacotes NuGet", digite "gerenciador de pacotes nuget" na caixa de pesquisa.
- Selecione o Gerenciador de Pacotes NuGet e clique em Baixar.
- Após a conclusão do download, você será solicitado a instalar.
- Após a conclusão da instalação, talvez seja solicitado que você reinicie o Visual Studio.
Adicionar o pacote NuGet da API Web
Depois que o Gerenciador de Pacotes NuGet for instalado, adicione a API Web Self-Host pacote ao seu projeto.
- No menu Ferramentas , selecione Gerenciador de Pacotes NuGet. Observação: se você não vir este item de menu, verifique se o Gerenciador de Pacotes NuGet está instalado corretamente.
- Selecione Gerenciar Pacotes NuGet para solução
- Na caixa de diálogo Gerenciar Pacotes NugGet , selecione Online.
- Na caixa de pesquisa, digite "Microsoft.AspNet.WebApi.SelfHost".
- Selecione o ASP.NET Web API pacote auto-host e clique em Instalar.
- Após a instalação do pacote, clique em Fechar para fechar a caixa de diálogo.
Observação
Instale o pacote chamado Microsoft.AspNet.WebApi.SelfHost, não AspNetWebApi.SelfHost.
Criar o modelo e o controlador
Este tutorial usa as mesmas classes de modelo e controlador que o tutorial Introdução.
Adicione uma classe pública chamada 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; }
}
}
Adicione uma classe pública chamada ProductsController
. Derive essa classe 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 obter mais informações sobre o código nesse controlador, consulte o tutorial Introdução. Esse controlador define três ações GET:
URI | Descrição |
---|---|
/api/products | Obtenha uma lista de todos os produtos. |
/api/products/id | Obtenha um produto por ID. |
/api/products/?category=category | Obtenha uma lista de produtos por categoria. |
Hospedar a API Web
Abra o arquivo Program.cs e adicione o seguinte usando instruções:
using System.Web.Http;
using System.Web.Http.SelfHost;
Adicione o código a seguir à classe 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) Adicionar uma reserva de namespace de URL HTTP
Este aplicativo escuta http://localhost:8080/
. Por padrão, escutar em um endereço HTTP específico requer privilégios de administrador. Ao executar o tutorial, portanto, você pode receber este erro: "HTTP não pôde registrar URL http://+:8080/" Há duas maneiras de evitar esse erro:
- Executar o Visual Studio com permissões de administrador elevadas ou
- Use Netsh.exe para conceder permissões à sua conta para reservar a URL.
Para usar Netsh.exe, abra um prompt de comando com privilégios de administrador e insira o seguinte comando command:following:
netsh http add urlacl url=http://+:8080/ user=machine\username
em que machine\username é sua conta de usuário.
Ao concluir a auto-hospedagem, exclua a reserva:
netsh http delete urlacl url=http://+:8080/
Chamar a API Web de um aplicativo cliente (C#)
Vamos escrever um aplicativo de console simples que chama a API Web.
Adicione um novo projeto de aplicativo de console à solução:
- Em Gerenciador de Soluções, clique com o botão direito do mouse na solução e selecione Adicionar Novo Projeto.
- Crie um novo aplicativo de console chamado "ClientApp".
Use o Gerenciador de Pacotes NuGet para adicionar o pacote ASP.NET Web API Core Libraryes:
- No menu Ferramentas, selecione Gerenciador de Pacotes NuGet.
- Selecione Gerenciar Pacotes NuGet para solução
- Na caixa de diálogo Gerenciar Pacotes NuGet , selecione Online.
- Na caixa de pesquisa, digite "Microsoft.AspNet.WebApi.Client".
- Selecione o pacote Bibliotecas de Clientes do Microsoft ASP.NET Web API e clique em Instalar.
Adicione uma referência em ClientApp ao projeto SelfHost:
- Em Gerenciador de Soluções, clique com o botão direito do mouse no projeto ClientApp.
- Selecione Adicionar Referência.
- Na caixa de diálogo Gerenciador de Referências , em Solução, selecione Projetos.
- Selecione o projeto SelfHost.
- Clique em OK.
Abra o arquivo Client/Program.cs. Adicione a seguinte instrução using :
using System.Net.Http;
Adicione uma instância HttpClient estática:
namespace Client
{
class Program
{
static HttpClient client = new HttpClient();
}
}
Adicione os métodos a seguir para listar todos os produtos, listar um produto por ID e listar produtos por categoria.
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 um desses métodos segue o mesmo padrão:
- Chame HttpClient.GetAsync para enviar uma solicitação GET para o URI apropriado.
- Chame HttpResponseMessage.EnsureSuccessStatusCode. Esse método gerará uma exceção se a resposta HTTP status for um código de erro.
- Chame ReadAsAsync<T> para desserializar um tipo CLR da resposta HTTP. Esse método é um método de extensão, definido em System.Net.Http.HttpContentExtensions.
Os métodos GetAsync e ReadAsasync são assíncronos. Eles retornam objetos Task que representam a operação assíncrona. Obter a propriedade Result bloqueia o thread até que a operação seja concluída.
Para obter mais informações sobre como usar o HttpClient, incluindo como fazer chamadas sem bloqueio, consulte Chamando uma API Web de um cliente .NET.
Antes de chamar esses métodos, defina a propriedade BaseAddress na instância httpClient como "http://localhost:8080
". Por exemplo:
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();
}
Isso deve gerar o seguinte. (Lembre-se de executar o aplicativo SelfHost primeiro.)
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.