Detección de la clase de inicio OWIN

En este tutorial se muestra cómo configurar la clase de startup de OWIN que se carga. Para obtener más información sobre OWIN, consulte Introducción al proyecto Katana. Este tutorial fue escrito por Rick Anderson (@RickAndMSFT), Praburaj Thiagarajan y Howard Dierking (@howard_dierking).

Requisitos previos

Visual Studio 2017

Detección de la clase de inicio OWIN

Cada aplicación OWIN tiene una clase de startup donde se especifican componentes para la canalización de la aplicación. Hay diferentes maneras de conectar la clase de startup con el runtime, en función del modelo de hospedaje que elija (OwinHost, IIS e IIS-Express). La clase de startup que se muestra en este tutorial se puede usar en todas las aplicaciones host. La clase de startup se conecta con el runtime de hospedaje mediante uno de los métodos siguientes:

  1. Convención de nomenclatura: Katana busca una clase denominada Startup en el espacio de nombres que coincida con el nombre del ensamblado o el espacio de nombres global.

  2. AtributoOwinStartup: este es el enfoque que la mayoría de los desarrolladores tomará para especificar la clase de startup. El atributo siguiente establecerá la clase de startup en la clase TestStartup del espacio de nombres StartupDemo.

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

    El atributo OwinStartup invalida la convención de nomenclatura. También puede especificar un nombre descriptivo con este atributo; sin embargo, el uso de un nombre descriptivo requiere que también use el elemento appSetting en el archivo de configuración.

  3. El elemento appSetting del archivo de configuración: el elemento appSetting invalida el atributo OwinStartup y la convención de nomenclatura. Puede tener varias clases de startup (cada una con un atributo OwinStartup) y configurar qué clase de startup se cargará en un archivo de configuración mediante marcado similar al siguiente:

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

    También se puede usar la siguiente clave, que especifica explícitamente la clase de startup y el ensamblado:

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

    El siguiente código XML del archivo de configuración especifica un nombre descriptivo de clase de startup de ProductionConfiguration.

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

    El marcado anterior debe usarse con el atributo siguiente OwinStartup, que especifica un nombre descriptivo y hace que la clase ProductionStartup2 se ejecute.

    [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 deshabilitar la detección de startup de OWIN, agregue appSetting owin:AutomaticAppStartup con un valor de "false" en el archivo web.config.

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

Crear una aplicación web de ASP.NET mediante OWIN Startup

  1. Cree una aplicación web Asp.Net vacía y asígnele el nombre StartupDemo. - Instalar Microsoft.Owin.Host.SystemWeb mediante el administrador de paquetes NuGet. En el menú Herramientas, seleccione Administrador de paquetes NuGet y, después, Consola del administrador de paquetes. Escriba el comando siguiente:

    Install-Package Microsoft.Owin.Host.SystemWeb
    
  2. Agregue una clase de startup de OWIN. En Visual Studio 2017, haga clic con el botón derecho en el proyecto y seleccione Agregar clase. En el cuadro de diálogo Agregar nuevo elemento, escriba OWIN en el campo de búsqueda y cambie el nombre a Startup.cs y, a continuación, seleccione Agregar.

    Screenshot of Add new item dialog.

    La próxima vez que quiera agregar una clase de startup de Owin, estará disponible en el menú Agregar.

    Screenshot of Add menu to add an Owin startup class.

    Como alternativa, puede hacer clic con el botón derecho en el proyecto y seleccionar Agregar, después Nuevo elemento y, a continuación, seleccione la clase de startup de Owin.

    Screenshot of Select the Owin Startup class.

  • Reemplace el código generado en el archivo Startup.cs por lo siguiente:

    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();
          }
       }
    }
    

    La expresión lambda app.Use se usa para registrar el componente de middleware especificado en la canalización de OWIN. En este caso, estamos configurando el registro de las solicitudes entrantes antes de responder a la solicitud entrante. El parámetro next es el delegado (Func<Task>) al siguiente componente de la canalización. La expresión lambda app.Run enlaza la canalización a las solicitudes entrantes y proporciona el mecanismo de respuesta.

    Nota:

    En el código anterior hemos comentado el atributo OwinStartup y nos basamos en la convención de ejecutar la clase denominada Startup. Presione F5 para ejecutar la aplicación. Presione actualizar varias veces.

    Screenshot of the runtime application.

    Nota: el número que se muestra en las imágenes de este tutorial no coincidirá con el número que usted ve. La cadena de milisegundos se usa para mostrar una nueva respuesta al actualizar la página. Puede ver la información de seguimiento en la ventana Salida.

    Screenshot of the output window.

Agregar más clases de startup

En esta sección agregaremos otra clase de startup. Puede agregar varias clases de startup de OWIN a la aplicación. Por ejemplo, es posible que quiera crear clases de startup para desarrollo, pruebas y producción.

  1. Cree una nueva clase de startup de OWIN y asígnele el nombre ProductionStartup.

  2. Reemplace el código generado con el siguiente:

    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. Presione Control F5 para ejecutar la aplicación. El atributo OwinStartup especifica que se ejecuta la clase de startup de producción.

    Screenshot of production startup class.

  4. Cree otra clase de startup de OWIN y nómbrela TestStartup.

  5. Reemplace el código generado con el siguiente:

    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");
                });
            }
        }
    }
    

    La sobrecarga de atributo OwinStartup anterior especifica TestingConfiguration como el nombre descriptivo de la clase Startup.

  6. Abra el archivo web.config y agregue la clave de startup de la aplicación OWIN que especifica el nombre descriptivo de la clase Startup:

    <?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. Presione Control F5 para ejecutar la aplicación. El elemento de configuración de la aplicación toma precedentes y se ejecuta la configuración de prueba.

    Screenshot of test configuration.

  8. Quite el nombre descriptivo del atributo OwinStartup de la clase TestStartup.

    [assembly: OwinStartup(typeof(StartupDemo.TestStartup))]
    
  9. Reemplace la clave de startup de la aplicación OWIN en el archivo web.config por la siguiente:

    <add key="owin:appStartup" value="StartupDemo.TestStartup" />
    
  10. Revierta el atributo OwinStartup de cada clase al código de atributo predeterminado generado por Visual Studio:

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

    Cada una de las claves de startup de la aplicación OWIN siguientes hará que se ejecute la clase de producción.

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

    La última clave de startup especifica el método de configuración de startup. La siguiente clave de startup de la aplicación OWIN permite cambiar el nombre de la clase de configuración a MyConfiguration.

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

Uso de Owinhost.exe

  1. Reemplace el archivo Web.config por el marcado siguiente:

    <?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>
    

    La última clave gana, por lo que en este caso TestStartup se especifica.

  2. Instale Owinhost desde PMC:

    Install-Package OwinHost
    
  3. Vaya a la carpeta de la aplicación (la carpeta que contiene el archivo Web.config) y en un símbolo del sistema y escriba:

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

    La ventana de comandos 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 un explorador con la dirección URL http://localhost:5000/.

    Screenshot of launching a browser with the localhost URL.

    OwinHost respeta las convenciones de startup enumeradas anteriormente.

  5. En la ventana de comandos, presione Entrar para salir de OwinHost.

  6. En la clase ProductionStartup, agregue el siguiente atributo OwinStartup que especifica un nombre descriptivo de ProductionConfiguration.

    [assembly: OwinStartup("ProductionConfiguration", 
               typeof(StartupDemo.ProductionStartup))]
    
  7. En el símbolo del sistema y escriba:

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

    Se carga la clase de startup Production. Screenshot of Production startup class.

    Nuestra aplicación tiene varias clases de startup y, en este ejemplo, hemos aplazado la clase de startup que se va a cargar hasta el runtime.

  8. Pruebe las siguientes opciones de startup 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"