Observação
O acesso a essa página exige autorização. Você pode tentar entrar ou alterar diretórios.
O acesso a essa página exige autorização. Você pode tentar alterar os diretórios.
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.