Detecção de classe de inicialização OWIN

Este tutorial mostra como configurar qual classe de inicialização OWIN é carregada. Para obter mais informações sobre o OWIN, consulte Uma visão geral do Projeto Katana. Este tutorial foi escrito por Rick Anderson ( @RickAndMSFT ), Praburaj Thiagarajan e Howard Dierking ( @howard_dierking ).

Pré-requisitos

Visual Studio 2017

Detecção de classe de inicialização OWIN

Cada aplicativo OWIN tem uma classe de inicialização em que você especifica componentes para o pipeline do aplicativo. Há diferentes maneiras de conectar sua classe de inicialização com o runtime, dependendo do modelo de hospedagem escolhido (OwinHost, IIS e IIS-Express). A classe de inicialização mostrada neste tutorial pode ser usada em todos os aplicativos de hospedagem. Você conecta a classe de inicialização com o runtime de hospedagem usando uma destas abordagens:

  1. Convenção de Nomenclatura: Katana procura uma classe nomeada Startup no namespace que corresponda ao nome do assembly ou ao namespace global.

  2. Atributo OwinStartup: essa é a abordagem que a maioria dos desenvolvedores adotará para especificar a classe de inicialização. O atributo a seguir definirá a classe de inicialização para a TestStartup classe no StartupDemo namespace.

    [assembly: OwinStartup(typeof(StartupDemo.TestStartup))]
    

    O OwinStartup atributo substitui a convenção de nomenclatura. Você também pode especificar um nome amigável com esse atributo, no entanto, usar um nome amigável exige que você também use o appSetting elemento no arquivo de configuração.

  3. O elemento appSetting no arquivo de configuração: o appSetting elemento substitui o atributo e a OwinStartup convenção de nomenclatura. Você pode ter várias classes de inicialização (cada uma usando um OwinStartup atributo) e configurar qual classe de inicialização será carregada em um arquivo de configuração usando marcação semelhante à seguinte:

    <appSettings>  
      <add key="owin:appStartup" value="StartupDemo.ProductionStartup" />
    </appSettings>
    

    A seguinte chave, que especifica explicitamente a classe de inicialização e o assembly também podem ser usados:

    <add key="owin:appStartup" value="StartupDemo.ProductionStartup, StartupDemo" />
    

    O XML a seguir no arquivo de configuração especifica um nome de classe de inicialização amigável de ProductionConfiguration.

    <appSettings>  
      <add key="owin:appStartup" value="ProductionConfiguration" />       
    </appSettings>
    

    A marcação acima deve ser usada com o atributo a seguir OwinStartup , que especifica um nome amigável e faz com que a ProductionStartup2 classe seja executada.

    [assembly: OwinStartup("ProductionConfiguration", typeof(StartupDemo.ProductionStartup2))]
    
    namespace StartupDemo
    {
        public class ProductionStartup
        {
            public void Configuration(IAppBuilder app)
            {
                app.Run(context =>
                {
                    string t = DateTime.Now.Millisecond.ToString();
                    return context.Response.WriteAsync(t + " Production OWIN App");
                });
            }
        }
        public class ProductionStartup2
        {
            public void Configuration(IAppBuilder app)
            {
                app.Run(context =>
                {
                    string t = DateTime.Now.Millisecond.ToString();
                    return context.Response.WriteAsync(t + " 2nd Production OWIN App");
                });
            }
        }
    }
    
  4. Para desabilitar a descoberta de inicialização do OWIN, adicione com appSetting owin:AutomaticAppStartup um valor no "false" arquivo web.config.

    <add key="owin:AutomaticAppStartup" value="false" />
    

Criar um aplicativo Web ASP.NET usando a inicialização OWIN

  1. Crie um aplicativo Web Asp.Net vazio e nomeie-o como StartupDemo. - Instale Microsoft.Owin.Host.SystemWeb usando o gerenciador de pacotes NuGet. No menu Ferramentas , selecione Gerenciador de Pacotes NuGet e, em seguida, Console do Gerenciador de Pacotes. Insira o seguinte comando:

    Install-Package Microsoft.Owin.Host.SystemWeb
    
  2. Adicione uma classe de inicialização OWIN. No Visual Studio 2017, clique com o botão direito do mouse no projeto e selecione Adicionar Classe.- Na caixa de diálogo Adicionar Novo Item , insira OWIN no campo de pesquisa e altere o nome para Startup.cs e selecione Adicionar.

    Captura de tela da caixa de diálogo Adicionar novo item.

    Na próxima vez que você quiser adicionar uma classe de Inicialização Owin, ela estará disponível no menu Adicionar .

    Captura de tela do menu Adicionar para adicionar uma classe de inicialização Owin.

    Como alternativa, você pode clicar com o botão direito do mouse no projeto e selecionar Adicionar, selecionar Novo Item e, em seguida, selecionar a classe de Inicialização Owin.

    Captura de tela de Selecionar a classe de Inicialização Owin.

  • Substitua o código gerado no arquivo Startup.cs pelo seguinte:

    using System;
    using System.Threading.Tasks;
    using Microsoft.Owin;
    using Owin;
    using System.IO;
    
    //[assembly: OwinStartup(typeof(StartupDemo.Startup))]
    
    namespace StartupDemo
    {
       public class Startup
       {
          public void Configuration(IAppBuilder app)
          {
             app.Use((context, next) =>
             {
                TextWriter output = context.Get<TextWriter>("host.TraceOutput");
                return next().ContinueWith(result =>
                {
                   output.WriteLine("Scheme {0} : Method {1} : Path {2} : MS {3}",
                   context.Request.Scheme, context.Request.Method, context.Request.Path, getTime());
                });
             });
    
             app.Run(async context =>
             {
                await context.Response.WriteAsync(getTime() + " My First OWIN App");
             });
          }
    
          string getTime()
          {
             return DateTime.Now.Millisecond.ToString();
          }
       }
    }
    

    A app.Use expressão lambda é usada para registrar o componente de middleware especificado no pipeline OWIN. Nesse caso, estamos configurando o registro em log de solicitações de entrada antes de responder à solicitação de entrada. O next parâmetro é o delegado (Tarefa>Func<) para o próximo componente no pipeline. A app.Run expressão lambda conecta o pipeline a solicitações de entrada e fornece o mecanismo de resposta.

    Observação

    No código acima, comentamos o OwinStartup atributo e dependemos da convenção de execução da classe chamada Startup .- Pressione F5 para executar o aplicativo. Clique em atualizar algumas vezes.

    Captura de tela do aplicativo de runtime.

    Observação: o número mostrado nas imagens neste tutorial não corresponderá ao número que você vê. A cadeia de caracteres de milissegundo é usada para mostrar uma nova resposta quando você atualiza a página. Você pode ver as informações de rastreamento na janela Saída .

    Captura de tela da janela de saída.

Adicionar mais classes de inicialização

Nesta seção, adicionaremos outra classe de inicialização. Você pode adicionar várias classes de inicialização OWIN ao seu aplicativo. Por exemplo, talvez você queira criar classes de inicialização para desenvolvimento, teste e produção.

  1. Crie uma nova classe de Inicialização OWIN e nomeie-a ProductionStartup.

  2. Substitua o código gerado pelo seguinte:

    using System;
    using System.Threading.Tasks;
    using Microsoft.Owin;
    using Owin;
    
    [assembly: OwinStartup(typeof(StartupDemo.ProductionStartup))]
    
    namespace StartupDemo
    {
        public class ProductionStartup
        {
            public void Configuration(IAppBuilder app)
            {
                app.Run(context =>
                {
                    string t = DateTime.Now.Millisecond.ToString();
                    return context.Response.WriteAsync(t + " Production OWIN App");
                });
            }
        }
    }
    
  3. Pressione Control F5 para executar o aplicativo. O OwinStartup atributo especifica que a classe de inicialização de produção é executada.

    Captura de tela da classe de inicialização de produção.

  4. Crie outra classe de Inicialização OWIN e nomeie-a TestStartup.

  5. Substitua o código gerado pelo seguinte:

    using System;
    using System.Threading.Tasks;
    using Microsoft.Owin;
    using Owin;
    
    [assembly: OwinStartup("TestingConfiguration", typeof(StartupDemo.TestStartup))]
    
    namespace StartupDemo
    {
        public class TestStartup
        {
            public void Configuration(IAppBuilder app)
            {
                app.Run(context =>
                {
                    string t = DateTime.Now.Millisecond.ToString();
                    return context.Response.WriteAsync(t + " Test OWIN App");
                });
            }
        }
    }
    

    A OwinStartup sobrecarga de atributo acima especifica TestingConfiguration como o nome amigável da classe Startup.

  6. Abra o arquivo web.config e adicione a chave de inicialização do aplicativo OWIN que especifica o nome amigável da classe de inicialização:

    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
      <appSettings>
        <add key="owin:appStartup" value="TestingConfiguration" />
      </appSettings>
      <system.web>
        <compilation debug="true" targetFramework="4.5" />
        <httpRuntime targetFramework="4.5" />
      </system.web>
    </configuration>
    
  7. Pressione Control F5 para executar o aplicativo. O elemento de configurações do aplicativo tem precedentes e a configuração de teste é executada.

    Captura de tela da configuração de teste.

  8. Remova o nome amigável do OwinStartup atributo na TestStartup classe.

    [assembly: OwinStartup(typeof(StartupDemo.TestStartup))]
    
  9. Substitua a chave de inicialização do aplicativo OWIN no arquivo web.config pelo seguinte:

    <add key="owin:appStartup" value="StartupDemo.TestStartup" />
    
  10. Reverta o OwinStartup atributo em cada classe para o código de atributo padrão gerado pelo Visual Studio:

    [assembly: OwinStartup(typeof(StartupDemo.Startup))]
    [assembly: OwinStartup(typeof(StartupDemo.ProductionStartup))]
    [assembly: OwinStartup(typeof(StartupDemo.TestStartup))]
    

    Cada uma das chaves de inicialização do aplicativo OWIN abaixo fará com que a classe de produção seja executada.

    <add key="owin:appStartup" value="StartupDemo.ProductionStartup" />
    <add key="owin:appStartup" value="StartupDemo.ProductionStartup, StartupDemo" />
    <add key="owin:appStartup" value="StartupDemo.ProductionStartup.Configuration, StartupDemo" />
    

    A última chave de inicialização especifica o método de configuração de inicialização. A seguinte chave de inicialização do Aplicativo OWIN permite que você altere o nome da classe de configuração para MyConfiguration .

    <add key="owin:appStartup" value="StartupDemo.ProductionStartup2.MyConfiguration" />
    

Usando Owinhost.exe

  1. Substitua o arquivo Web.config pela seguinte marcação:

    <?xml version="1.0" encoding="utf-8"?>
    <configuration>
       <appSettings>
          <add key="owin:appStartup" value="StartupDemo.Startup" />
          <add key="owin:appStartup" value="StartupDemo.TestStartup" />
       </appSettings>
      <system.web>
        <compilation debug="true" targetFramework="4.5" />
        <httpRuntime targetFramework="4.5" />
      </system.web>
    </configuration>
    

    A última chave vence, portanto, nesse caso TestStartup , é especificado.

  2. Instale o Owinhost por meio do PMC:

    Install-Package OwinHost
    
  3. Navegue até a pasta do aplicativo (a pasta que contém o arquivo Web.config ) e em um prompt de comando e digite:

    ..\packages\Owinhost<Version>\tools\Owinhost.exe
    

    A janela de comando mostrará:

    C:\StartupDemo\StartupDemo>..\packages\OwinHost.2.0.0\tools\Owin
    Host.exe
    Starting with the default port: 5000 (http://localhost:5000/)
    Started successfully
    Press Enter to exit
    
  4. Inicie um navegador com a URL http://localhost:5000/.

    Captura de tela da inicialização de um navegador com a URL localhost.

    O OwinHost homenageou as convenções de inicialização listadas acima.

  5. Na janela de comando, pressione Enter para sair do OwinHost.

  6. ProductionStartup Na classe, adicione o seguinte atributo OwinStartup que especifica um nome amigável de ProductionConfiguration.

    [assembly: OwinStartup("ProductionConfiguration", 
               typeof(StartupDemo.ProductionStartup))]
    
  7. No prompt de comando e digite:

    ..\packages\OwinHost.2.0.0\tools\OwinHost.exe ProductionConfiguration
    

    A classe de inicialização Produção é carregada. Captura de tela da classe de inicialização Produção.

    Nosso aplicativo tem várias classes de inicialização e, neste exemplo, adiamos qual classe de inicialização carregar até o runtime.

  8. Teste as seguintes opções de inicialização de runtime:

    ..\packages\OwinHost.2.0.0-rc1\tools\OwinHost.exe StartupDemo.TestStartup
    ..\packages\OwinHost.2.0.0-rc1\tools\OwinHost.exe "StartupDemo.TestStartup,StartupDemo"
    ..\packages\OwinHost.2.0.0-rc1\tools\OwinHost.exe StartupDemo.TestStartup.Configuration
    ..\packages\OwinHost.2.0.0-rc1\tools\OwinHost.exe "StartupDemo.TestStartup.Configuration,StartupDemo"