Microsoft KATANA com OwinHost

Microsoft KATANA com OwinHost

Ola pessoal, tudo bem? Ano novo começando, espero que tenham passado um excelente período de festas. Hoje, vamos retomar nossa série sobre Owin/Katana (vNext) só que desta vez vamos aprender como integrar um projeto Asp.Net com o host de aplicações web chamado: OwinHost, distribuido através do Nuget.

KATANA usando OwinHost

O desenvolvimento de projetos Asp.Net utilizando o host OwinHost.exe não muda em absolutamente nada do que vimos anteriormente aqui e aqui, além de continuarmos com a possibilidade de escolha entre projetos: Class Library ou Web. Ok! mas deve existir alguma diferença no desenvolvimento de alguma dessas opções, ou não? A resposta é SIM!

Eis aqui as diferenças:

  • Class Library – Aqui você terá a configuração da sua aplicação mais simples e com referências (assemblies) do seu projeto usando o minimo necessário. Contudo, toda referência que for necessária ao seu projeto, precisa ser adicionada manualmente além de atachar manualmente o seu projeto ao processo do OwinHost para obter o recurso de Debbuging, não se preocupe Vamos mostrar mais a frente neste mesmo artigo Smile. Outro "incomodo" é que você não terá acesso a todos os recursos das ferramentas web.
  • Web Application – Com essa opção, após criar o seu projeto você observará que várias referências serão adicionadas em excesso ao projeto web, te obrigado a remover uma a uma, deixando seu projeto utilizando apenas as referências necessárias. Utilizando esta opção, você será capaz de utilizar todos os recursos e ferramentas web.

Criando o projeto usando: Class Library

Show me the code man! Sim, vamos utilizar a opção mais leve e menos comum ao cenário de desenvolvimento web: Class Library! Então, crie um projeto vazio do tipo Class Library e em seguida remova a classe Class1.cs. Agora chegou a hora de adicionarmos a classe que começa a fazer toda a diferença ao nosso projeto e será responsável pelas configurações importantes e inicialização da aplicação web: OWIN Startup! A figura abaixo mostra onde você pode localizar a opção:

image

Após adicionar a classe Startup.cs, você verá que o visual studio adicionou, via Nuget, automaticamente todas as referências necessárias para que essa classe consiga funcionar: Owin.dll e Microsoft.Owin.dll, e todas as outras referências são o minimo necessário para que seu projeto funcione. Clean Solution, não é fantástico não depender mais de referências desnecessárias e poder ter um projeto inicializando e funcionando de forma mais performática !? Open-mouthed smile

Adicione o código abaixo para deixarmos nossa classe pré-configurada para inicializarmos o processo de start e debug:

public void Configuration(IAppBuilder app) { app.Run(context => { context.Response.ContentType = "text/plain"; return context.Response.WriteAsync("Ola, eu sou o OwinHost executando. Horario de excucao: " + DateTime.Now.ToString() + " !"); }); }  

Inicializando e debugando sua aplicação

Agora que temos a classe Startup configurada com o mímimo necessário para executarmos o primeiro start da aplicação, vamos adicionar ao projeto o host OwinHost.exe. Abra o Package Manager Console e digite o comando: Install-Package OwinHost. Após a execução, assim como todos os outros pacotes que são instalados via NuGet este não será diferente, ou seja, você encontrará sua instalação na pasta ..\packages\OwinHost.3.0.1 e as ferramentas dentro da pasta ..\packages\OwinHost.3.0.1\tools.

Por convenção o aplicativo OwinHost.exe quando executado sem parâmetros carreta os assemblies diretamente da pasta .\bin relativa raiz do seu projeto, e apartir dessa chamada o host irá procurar pelo assembly que contenha o atribuito OwinStartup ou configuração no arquivo de configuração web.config ou app.config, o nosso caso. Como estamos desenvolvendo uma Class Library, por padrão o Visual Studio realiza o output dos assemblies no diretório .\bin\debug, precisamos alterar a configuração do Output Path conforme imagem abaixo:

image

Agora vamos se nossa aplicação está funcionando conforme nossa configuração. Abra o prompt de comando (no meu caso eu estou usando o cmder) e vá para a pasta da sua aplicação e informe o path do OwinHost.exe, conforme imagem abaixo:
image

Pronto! A aplicação está funcionando perfeitamente. Agora é só abrir o browser de sua preferência e informar a url: https://localhost:5000:

image

Por padrão, como não foi informada nenhuma configuração de porta para o serviço OwinHost, o mecanismo inicializa o projeto na porta padrão 5000. Mas poderiamos também realizar essa alteração executando o aplicativo OwinHost.exe –p 9000, por exemplo, e teriamos a aplicação executando em uma porta diferente da porta padrão. Duvida? Tente você mesmo executar o host do owin com uma porta diferente e teste Smile. Outros parâmetros podem ser utilizados para configurar o OwinHost, basta que você informe /? que o console de comando listará todos os comandos que podem ser configurados.

Caso você queira debugar sua aplicação em modo Class Library, você precisa realizar um procedimento um tanto incomum, mas que pode resolver o seu problema: Attach Process! Isso mesmo, atachar o processo do OwinHost ao seu projeto, conforme a imagem abaixo:

image

Agora é só adicionar um breakpoint no código do método Configuration que seu projeto está apto para debug.

Outras formas de registrar a classe: Startup

Bom agora que você entende um pouco mais sobre aplicações OWIN, sabe que toda aplicação desse tipo precisa ter uma classe de inicialização, ou seja, uma classe *Startup. *

  • Naming Convention (Convensão por Nome) – Utilizando esta opção, basta que você adicione na raíz do seu projeto uma classe com o nome Startup
  • OwinStartup – Utilizando essa classe de atributo a nível de informações do assembly, podemos informar um nome mais amigável para a classe de bootstrap (inicialização) Startup

[assembly: OwinStartup("MeuPrimeiroCustomStartup",typeof(KatanaOwinHost.MeuPrimeiroCustomStartup))]

  • Seção appSettings (app.config/web.config)

<?xml version="1.0" encoding="utf-8" ?> <configuration> <appSettings> <add key="owin:appStartup" value="KatanaOwinHost.MeuPrimeiroCustomStartup"/> </appSettings> </configuration>

  • Startup Option – Essa opção será utilizada em caso de sua aplicação ser do tipo CustomHost (em modo Console, por exemplo)

WebApp.Start<MeuPrimeiroCustomStartup>(<a href="https://localhost:5000">https://localhost:5000</a>); - Command Line argument (Parâmetro de linha de comando)

..\packages\OwinHost.3.0.0\tools\OwinHost.exe KatanaOwinHost.MeuPrimeiroCustomStartup

Criando Startup amigáveis

Vamos agora criar algumas classes de bootstratp e mostrar como podemos inicializar nossa aplicação com várias versões diferentes de inicialização.

Dentro do arquivo Startup.cs crie as classes conforme mostrado abaixo:

using Microsoft.Owin;  
using Owin;  
using System;

[assembly: OwinStartup("Desenv",typeof(KatanaOwinHost.DesenvolvimentoStartup))]
[assembly:OwinStartup("Teste",typeof(KatanaOwinHost.TesteStartup))]
[assembly: OwinStartup("Prod", typeof(KatanaOwinHost.Producaoptartup))]
namespace KatanaOwinHost  
{
    public class DesenvolvimentoStartup
    {
        public void Configuration(IAppBuilder app) 
        {
            app.Run(context => {
                    context.Response.ContentType = "text/plain";
                    context.Response.WriteAsync("");
                    return context.Response.WriteAsync("Vamos começar a desenvolver o nosso projeto? :D");
            });
        }
    }

    public class TesteStartup
    {
        public void Configuration(IAppBuilder app)
        {
            app.Run(context => {
                context.Response.ContentType = "text/plain";
                context.Response.WriteAsync("");
                return context.Response.WriteAsync("Ok, agora estou pronto para receber uma bateria de testes ");
            });
        }
    }

    public class Producaoptartup
    {
        public void Configuration(IAppBuilder app)
        {
            app.UseWelcomePage();
        }
    }
}

Para ter acesso ao Middleware .UseWelcomePage(), é necessário instalar um novo pacote do Owin. Para isso, informe o comando abaixo no console Package Manager Console (PMC):

PM> Install-Package Microsoft.Owin.Diagnostics

Para testarmos a aplicação acima, abra o cmder/cmd e navegue até raíz da pasta do seu projeto, conforme a imagem abaixo:

image

Agora vamos executar o OwinHost.exe passando alguns parâmetros, como os exemplos abaixo:

..\packages\OwinHost.3.0.1\tools\OwinHost.exe desenv ..\packages\OwinHost.3.0.1\tools\OwinHost.exe –port 8000 teste ..\packages\OwinHost.3.0.1\tools\OwinHost.exe –port 9000 prod

Abaixo segue imagens com o resultado do servidor OwinHost executando 3 instâncias independentes, uma para cada ambiente:

Desenvolvimento

image

Teste

image

Produção

image

Conclusão

No artigo de hoje tentei passar um pouco da idéia da construção do zero de uma aplicação Katana (vNext) utilizando Class Library. Essa solução pode ser utilizada como solução em micro-serviços, por exemplo, pois seu pipeline de inicialização e execução é extremamente leve e flexivel para configurar várias portas e ambientes de execução por meio de nomes amigáveis das classes Startup. Apresentei como é possível termos várias classes de bootstrap no mesmo projeto e como podemos configurar o servidor OwinHost para utilizar de forma independente cada uma dessas classes.

Espero que tenham gostado. Aguardem o próximo artigo no qual abordarei como construir Middleware Customizados e registra-los no pipeline de uma aplicação Owin.

O código de exemplo desse artigo está no meu repositório no Github

Gostou do artigo? Deixe seu comentário, vamos discutir mais sobre o tema!
Grande abraço e até o nosso próximo assunto Smile

Comments