Compartilhar via


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.

Captura de tela da caixa de diálogo Novo Projeto mostrando o item visual C# na lista de pastas e o item aplicativo Windows Forms, que está realçado em cinza.

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.

Captura de tela da janela Gerenciador de Soluções mostrando a lista suspensa estrutura de destino com o item dot NET Framework 4, que está realçado em azul.

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:

  1. Inicie o Visual Studio.
  2. No menu Ferramentas, selecione Extensões e atualizações.
  3. Na caixa de diálogo Extensões e Atualizações, selecione Online.
  4. Se você não vir "Gerenciador de Pacotes NuGet", digite "gerenciador de pacotes nuget" na caixa de pesquisa.
  5. Selecione o Gerenciador de Pacotes NuGet e clique em Baixar.
  6. Após a conclusão do download, você será solicitado a instalar.
  7. Após a conclusão da instalação, talvez seja solicitado que você reinicie o Visual Studio.

Captura de tela da caixa de diálogo Extensões e Atualizações mostrando o Gerenciador de Pacotes NuGet nos resultados da pesquisa, que está realçado em cinza.

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.

  1. 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.
  2. Selecione Gerenciar Pacotes NuGet para solução
  3. Na caixa de diálogo Gerenciar Pacotes NugGet , selecione Online.
  4. Na caixa de pesquisa, digite "Microsoft.AspNet.WebApi.SelfHost".
  5. Selecione o ASP.NET Web API pacote auto-host e clique em Instalar.
  6. 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.

Captura de tela da caixa de diálogo Gerenciar Pacotes NuGet mostrando o Microsoft A SP dot Net Web A P I Self Host, que está realçado em azul.

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

Captura de tela da Gerenciador de Soluções mostrando os itens de menu Adicionar e Novo Projeto, que são realçados em branco.

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.

Captura de tela da caixa de diálogo Gerenciador de Referências mostrando o projeto auto-host, que está realçado com uma caixa azul.

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:

  1. Chame HttpClient.GetAsync para enviar uma solicitação GET para o URI apropriado.
  2. Chame HttpResponseMessage.EnsureSuccessStatusCode. Esse método gerará uma exceção se a resposta HTTP status for um código de erro.
  3. 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.

Captura de tela da janela do console mostrando uma lista de produtos associados à ID e categorias.