.NET -  Criando uma Self-Host Web API OWIN - IV


 Neste artigo vou mostrar como criar uma aplicação Self-Host Web API em uma aplicação console.

Continuando a terceira parte do artigo hoje vamos criar uma Self-Host Web API.

Nosso objetivo será mostrar como hospedar uma ASP.NET Web API em um aplicativo console, usando o OWIN para realizar a auto-hospedagem do framework Web API.

Recursos usados:

Criando a Web API no VS 2017

Vamos abrir a solução SelfHost_App criada no VS 2017 Community no artigo anterior e incluir um novo projeto nesta solução. Estou fazendo isso apenas para ter os dois projetos em uma única solução.

No menu File clique em Add -> New Project e selecione o template Console App (.NET Framework) informando o nome SelfHost_WebApi;

Dessa forma teremos a solução contendo dois projetos :

Adicionando os Pacotes NuGet

Precisamos incluir o pacote Nuget Microsoft.AspNet.WebApi.OwinSelfHost no projeto atual.

Este pacote permite que você hospede uma a ASP .NET Web API em seu próprio processo usando o servidor OWIN HttpListener. A ASP .NET Web API é um framework que facilita a criação de serviços HTTP que atingem uma ampla gama de clientes, incluindo navegadores e dispositivos móveis. A ASP.NET Web API é uma plataforma ideal para criar aplicativos RESTful na plataforma .NET.

Nota:  RESTful significa apenas a capacidade de implementar o REST. São serviços que possuem comportamento REST.

No menu Tools, selecione Nuget Package Manager e selecione Mange Nuget Packages for Solution;

Na janela clique em Browse e selecione o pacote Microsoft.AspNet.WebApi.OwinSelfHost marque o projeto e clique no botão Install:

   

Espiando a solução veremos o nosso projeto Console exibindo as referências OWIN:

Pacotes:

Owin: Disponibiliza o objeto AppBuilder que contém o método Use que permite manipular o Middleware e aceita um delegate que irá conter todo o contexto da requisição.

Microsoft.Owin.Hosting - Disponibiliza o método Start que vai requisitar uma URL e um delegate como parâmetro, que irá tratar todas as requisições vindas da URL;



 

Agora vamos incluir a classe Startup.cs no projeto para poder definir algumas configurações iniciais em nossa Web API.

Criando a classe Startup

No menu Project clique em Add Class e selecione o template OWIN Startup Class informando o nome Startup e clicando no botão Add:

Na classe Startup do nosso projeto vamos definir as configurações da rota para a nossa Web API OWIN.

Inclua o código abaixo no arquivo Startup :

using Microsoft.Owin;
using Owin;
using System.Web.Http;
[assembly: OwinStartup(typeof(SelfHost_WebApi.Startup))]
namespace SelfHost_WebApi
{
    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
             //configura a web api para auto-hospedagem
            var config = new HttpConfiguration();

            config.Routes.MapHttpRoute(
                name: "DefaultApi",
                routeTemplate: "api/{controller}/{id}",
                defaults: new { id = RouteParameter.Optional }
           );
           app.UseWebApi(config);
        }
    }
}

Definimos a rota api/nome_controller para acessar o serviço da nossa web api.

A seguir usamos middleware UseWebApi que configura a ASP.NET Web API para executar o OWIN. A OWIN abstrai um servidor da Web e você pode executá-lo tanto no IIS quanto no HTTP.SYS, o que permite que você forneça um servidor da Web em seu próprio aplicativo Console.

Assim, estamos configurando o OWIN/Katana para enviar requisições da web por meio da Web API.

Nota: É o Katana, uma implementação específica do OWIN, que executa sobre o IIS ou no HTTP.SYS.

Agora precisamos criar um controlador e definir o serviço da nossa Web API.

Criando o Controller

Vamos criar uma pasta chamada Controllers, via menu Project->New Folder, no projeto, e a seguir incluir nesta pasta um classe chamada UniversoController que será o nosso controlador e que fará o papel da nossa Web API.

Inclua o código abaixo no método Main() da classe Program:

using System.Collections.Generic;
using System.Linq;
using System.Web.Http;
namespace SelfHost_WebApi.Controllers
{
    public class UniversoController : ApiController
    {
        private static List<Planeta> planetas = new List<Planeta>()
        {
            new Planeta { Id=1, Nome = "Mercúrio", Distancia = 0.39},
            new Planeta { Id=2, Nome = "Vênus", Distancia = 0.72 },
            new Planeta { Id=3, Nome = "Terra", Distancia = 1.00 },
            new Planeta { Id=4, Nome = "Marte", Distancia = 1.52 },
            new Planeta { Id=5, Nome = "Júpiter", Distancia = 5.20 },
            new Planeta { Id=6, Nome = "Saturno", Distancia = 9.53 },
            new Planeta { Id=7, Nome = "Urano", Distancia = 19.10 },
            new Planeta { Id=8, Nome = "Netuno", Distancia = 30.00 }
        };
        public IEnumerable<Planeta> Get()
        {
            return planetas;
        }
        public Planeta Get(int id)
        {
            return planetas.Where(p => p.Id == id).FirstOrDefault();
        }
    } 
}

Note que a nossa classe UniversoController herda de ApiController pois esta fazendo o papel de  um controlador da Web API.

Para não complicar muito o exemplo definimos apenas dois métodos nesta classe:

Os dados estão sendo fornecidos por uma lista estática chamada planetas.

Precisamos criar no projeto (poderíamos ter feito isso na própria classe) uma classe Planeta com o seguinte código:

    public class Planeta
    {
        public int Id { get; set; }
        public string Nome { get; set; }
        public double Distancia { get; set; }
    }

 

Definindo o Host local no arquivo Program

Agora precisamos tornar nossa aplicação Console em um servidor local.

Para isso vamos usar a classe WebApp do namespace Microsoft.Owin.Hosting que possui métodos para carregar, montar e iniciar uma aplicação web.

Inclua o código abaixo no método Main() da classe Program:

using Microsoft.Owin.Hosting;
using static System.Console;
namespace SelfHost_WebApi
{
    class Program
    {
        static void Main(string[] args)
        {
            string baseAddress = "http://localhost:9000/";
            // Inicia o host OWIN 
            using (WebApp.Start<Startup>(url: baseAddress))
            {
                WriteLine("Web Api Self-Host..."); 
                ReadLine();
            }
        }
    }
}

Definimos o endereço base para atendimento da Web API e iniciamos o host.

Testando a Web Api

Agora para testar vamos executar a nossa aplicação.

Abra o seu navegador e digite a url definida na classe Main acrescida da rota da nossa web api:  http://localhost:9000/api/universo

Com isso iremos obter todos os planetas:

A seguir digitando a url acrescida da rota e de um id específico de um planeta: http://localhost:9000/api/universo/3

Obtemos a informação do planeta:

Temos assim a Web API funcionando em uma auto-hospedagem (seria um servidor embarcado) sem precisar usar o IIS ou outro server.

Podemos também usar a classe HttpClient e fazer uma requisição usando o método GetAsync para obter informações da Web API.

Para isso altere o código do método Main:

using Microsoft.Owin.Hosting;
using System.Net.Http;
using static System.Console;
namespace SelfHost_WebApi
{
    class Program
    {
        static void Main(string[] args)
        {
            string baseAddress = "http://localhost:9000/";
            // Inicia o host OWIN 
            using (WebApp.Start<Startup>(url: baseAddress))
            {
                ////Cria um HttpCient e faz uma requisição para api/universo 
                HttpClient client = new HttpClient();
                var response = client.GetAsync(baseAddress + "api/universo").Result;
                WriteLine(response);
                WriteLine(response.Content.ReadAsStringAsync().Result);
                WriteLine("Web Api Self-Host....");
                ReadLine();
            }
        }
    }
}

Executando a aplicação novamente, agora veremos no console o seguinte resultado:

Pegue o projeto completo aqui:  SelfHost_App_WebApi.zip (sem as referências)

'Agora é o juízo deste mundo; agora será expulso o príncipe deste mundo.
E eu, quando for levantado da terra, todos atrairei a mim.
E dizia isto, significando de que morte havia de morrer.'
João 12:31-33

Veja os Destaques e novidades do SUPER DVD Visual Basic (sempre atualizado) : clique e confira !

Quer migrar para o VB .NET ?

Quer aprender C# ??

Quer aprender os conceitos da Programação Orientada a objetos ?

Quer aprender o gerar relatórios com o ReportViewer no VS 2013 ?

Referências:


José Carlos Macoratti