.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. |
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:
Super DVD Vídeo Aulas - Vídeo Aula sobre VB .NET, ASP .NET e C#
Super DVD C# - Recursos de aprendizagens e vídeo aulas para C#
Curso Fundamentos da Programação Orientada a Objetos com VB .NET
ASP .NET Web API - Criando e Consumindo uma Web API ... - Macoratti
ASP .NET Core - Criando sua primeira Web API com ASP ... - Macoratti