web-dev-qa-db-fra.com

Comment et quand la méthode de configuration dans la classe OwinStartup est-elle appelée/exécutée?

Avant de poser ma question, j'ai déjà parcouru les posts suivants:

  1. Impossible d'exécuter la classe de démarrage OWIN dans IIS Express après renommer le projet ASP.NET file et tous les messages mentionnés dans la question. 
  2. Détection de démarrage OWIN
  3. OwinStartupAttribute requis dans web.config pour corriger l'erreur de serveur n ° 884
  4. Classe de démarrage OWIN non Détectée

Voici la disposition des dossiers de mon projet:

 enter image description here
Actuellement, il n'y a pas de contrôleur ou de vue. Juste le fichier Owin Startup.


Startup.cs

using System;
using Microsoft.Owin;
using Owin;

[Assembly: OwinStartup(typeof(Bootstrapper.Startup))]

namespace Bootstrapper
{
    public class Startup
    {
        public void Configuration(IAppBuilder app)
        {
            app.Run(async context =>
            {
                await context.Response.WriteAsync(GetTime() + " My First OWIN App");
            });
        }

        string GetTime()
        {
            return DateTime.Now.Millisecond.ToString();
        }
    }
}


Web.config

<appSettings>
    <add key="owin:AutomaticAppStartup" value="true" />
    <add key="owin:appStartup" value="Bootstrapper.Startup" />
    <add key="webpages:Version" value="2.0.0.0" />
    <add key="webpages:Enabled" value="false" />
    <add key="PreserveLoginUrl" value="true" />
    <add key="ClientValidationEnabled" value="true" />
    <add key="UnobtrusiveJavaScriptEnabled" value="true" />
  </appSettings>


J'ai la référence suivante dans le projet Bootstrapper:

  1. Microsoft.Owin
  2. Microsoft.Owin.Host.SystemWeb
  3. Owin
  4. Système
  5. System.Core


UPDATE: J'ai oublié d'ajouter le message d'erreur:

 enter image description here


À présent,

  1. POURQUOI ne fonctionne-t-il pas?
  2. Quel est le processus étape par étape pour ajouter et utiliser une classe Owin Startup dans un projet très basique (comme accéder à Home/Index)?
  3. Comment et quand la méthode de configuration dans la classe Owin Startup est-elle appelée/exécutée?


UPDATE: le 10 déc. 2016

Vérifiez le Project-Folder-Layout. Dans le projet Bootstrapper, j'ai le fichier suivant:
IocConfig.cs

[Assembly: PreApplicationStartMethod(typeof(IocConfig), "RegisterDependencies")]

namespace Bootstrapper
{
    public class IocConfig
    {
        public static void RegisterDependencies()
        {
            var builder = new ContainerBuilder();

            builder.RegisterControllers(typeof(MvcApplication).Assembly);
            builder.RegisterSource(new AnyConcreteTypeNotAlreadyRegisteredSource());
            builder.RegisterModule<AutofacWebTypesModule>();

            builder.RegisterType(typeof(MovieService)).As(typeof(IMovieService)).InstancePerRequest();
            builder.RegisterType(typeof(MovieRepository)).As(typeof(IMovieRepository)).InstancePerRequest();

            var container = builder.Build();
            DependencyResolver.SetResolver(new AutofacDependencyResolver(container));
        }
    }
}

Maintenant, je veux exécuter IocConfig.RegisterDependencies() dans la classe OWIN Startup. Je fais using Bootstrapper dans Startup en haut, mais cela ne fonctionne pas. Je veux dire que je suis incapable de faire référence à IocConfig dans Startup. Comment résoudre ce problème?

7
Vedant

Il est un peu tard, mais j'ai trouvé la solution pour placer la classe de démarrage OWIN dans un projet séparé. Tout ce que vous avez fait dans votre projet est correct, vous ne devez appliquer qu'un seul changement dans les propriétés de votre projet Bootstrapper. Cliquez avec le bouton droit sur le projet Bootstrapper, entrez les propriétés, cliquez sur l'onglet Générer et recherchez le chemin de sortie. Vous devriez voir le patch de sortie standard bin\debug \, ce qui signifie que votre dll Bootstrapper atterrira dans ce dossier. Vous devez modifier cela dans le dossier bin, où se trouve votre application Web.

Par exemple, j'ai créé une solution simple avec deux projets, le premier est une application Web vide et le second est une bibliothèque avec la classe de démarrage OWIN. Dans les propriétés du deuxième projet, j'ai modifié le chemin de sortie en ..\OwinTest.Web\bin. Cela causera qu'après la construction toutes les dll atterriront dans un dossier. Vous pouvez maintenant exécuter votre application et OWIN Startup devrait fonctionner correctement.

Voici l'écran des paramètres de propriétés du projet Bootstrapper:

 enter image description here

0
Roman Suska
  1. Créer un projet d'application Web vide
  2. Installez OWIN en utilisant NuGet (install-package Microsoft.Owin.Host.SystemWeb)
  3. Ajouter une classe vide à la racine du projet appelée "Startup.cs"

Ici, je vais répondre à votre troisième question. La classe de démarrage est un point d’entrée d’OWIN et est recherchée automatiquement. Comme indiqué dans les documents officiels:

Convention de nommage: Katana recherche une classe nommée Startup dans l'espace de noms correspondant au nom de l'assembly ou à l'espace de noms global.

Notez que vous pouvez également choisir votre propre nom de classe de démarrage, mais vous devez le configurer à l'aide de décorateurs ou d'AppConfig. Comme indiqué ici: https://www.asp.net/aspnet/overview/owin-and-katana/owin-startup-class-detection

Voici tout ce dont vous avez besoin pour un test OWIN de base et fonctionnel:

using Owin;
using System;

namespace OwinTest
{
    public class Startup
    {
        public static void Configuration(IAppBuilder app)
        {
            app.Use(async (ctx, next) =>
            {
                await ctx.Response.WriteAsync(DateTime.Now.ToString() + " My First OWIN App");
            });
        }
    }
}

Si vous souhaitez utiliser MVC (je suppose que par "Home/Index" vous voulez dire MVC), procédez comme suit:

  1. Installez MVC NuGet (install-package Microsoft.AspNet.Mvc).
  2. Ajouter un dossier "Contrôleurs" dans votre projet.
  3. Créez un nouveau contrôleur vide sous le nouveau dossier "Controlles" (clic droit -> ajouter -> Contrôleur MVC 5 - vide) et nommez-le "HomeController".
  4. Créez une page de vue sous le dossier "Views/Home" nouvellement créé. Clic droit -> ajouter -> Voir. Nommez-le "Index" et décochez la case "utiliser la page".

Rendre la page héritée de WebViewPage. Cela devrait ressembler à ceci:

@inherits System.Web.Mvc.WebViewPage
@{
    Layout = null;
}

<!DOCTYPE html>

<html>
<head>
    <meta name="viewport" content="width=device-width" />
    <title>Index</title>
</head>
<body>
    <div> 
        <h1>Owin Hello</h1>
    </div>
</body>
</html>
  1. Ajoutez un global.asax pour configurer des itinéraires. Faites un clic droit sur le projet -> ajouter -> Nouvel élément -> Classe d'application globale.

Ajoutez la définition des routes à la méthode Application_Start:

protected void Application_Start(object sender, EventArgs e)
{
    RouteTable.Routes.MapRoute(name: "Default",
        url: "{controller}/{action}",
        defaults: new { controller = "Home", action = "Index" });
}
  1. N'oubliez pas de commenter le middleware "..await ctx.Response.WriteAsync ..." ci-dessus. Sinon, cela interférerait avec le MVC.
  2. Exécutez le projet. Devrait travailler.
6
Ivan Sivak