Nouvelles Chroniques d'Amethyste

Penser au Sens, pas au Verbe

Ajouter un pipeline dans une application Web

Poster un commentaire

Nous avons vu dans un article précédent comment intégrer des middlewares Owin dans le pipeline ASP.NET.

Une autre possibilité s’offre à nous: faire fonctionner en parallèle le pipeline Owin et le pipeline Asp.net.

Nous allons explorer cette solution dans cet article.

Commençons par créer une application MVC (ou ASP.NET) par défaut. On la lance pour vérifier que tout va bien.

 

Nous allons héberger dans cette application MVC tout à fait normale, un formulaire de téléchargement de fichiers géré par un pipeline Owin. Cet article sera aussi l’occasion d’analyser en détails le package StaticFiles.

Si vous avez créé le projet avec Visual Studio 2013, les dépendances Owin seront déjà là (sauf StaticFile) ainsi que les fichiers Startup.cs,, sinon vous devez ajouter les packages:

  • Install-Package Microsoft.Owin.Host.SystemWeb
  • Install-Package Owin
  • Install-Package Microsoft.Owin.StaticFiles

 

On créée aussi le fichier Startup.cs suivant:

public partial class Startup
{
    public void Configuration(IAppBuilder app)
    {
        string root = AppDomain.CurrentDomain.BaseDirectory;
        FileServerOptions options = new FileServerOptions();
        options.EnableDirectoryBrowsing = true;
        options.FileSystem = new PhysicalFileSystem(root);
        options.RequestPath = new PathString("/load");

        app.UseFileServer(options);
    }
}

Note: les méthodes d’extension font partie de l’espace de noms Owin.

Si vous lancez l’application à nouveau, vous voyez le site web par défaut que l’on s’attend à voir.

Lorsque l’on lance l’url: ~/load une page similaire doit s’afficher:

07-05-2014 00-03-56

Un clic sur un fichier le télécharge.

Le code ne pose guère de problèmes. Notez juste que FileSystem désigne le répertoire physique où se situe les fichiers, tandis que RequestPath désigne l’url relative pour se rendre sur la page de téléchargement.

Notez que RequestPath DOIT commencer par / (slash), sinon ArgumentException est levée.

 

On a vu se produire un truc un peu magique, comment le code s’est t’il débrouillé avec le ContentType?

La réponse est que le Framework propose une table de correspondance entre un grand nombre d’extension de fichier et de ContentType:

https://katanaproject.codeplex.com/SourceControl/latest#src/Microsoft.Owin.StaticFiles/ContentTypes/FileExtensionContentTypeProvider.cs

 

Il est possible de compléter cette liste en implémentant IContentTypeProvider:


public sealed class MonContentType : FileExtensionContentTypeProvider
{
    public MonContentType()
    {
        Mappings.Add(".toto", "application/text");
    }
}

 

Nous pouvons ensuite compléter notre code:

options.StaticFileOptions.ContentTypeProvider = new MonContentType();

 

Utilisation du routing

 

On est pas obligé d’implanter le pipeline OwIn dans une classe Startup. On peut le faire dans une route exactement comme en MVC, Web API…

Pour désactiver la recherche automatique de la classe Startup, compléter le web.config:

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

 

Puis ajoutez le code suivant dans Application_Start (global.asax):


RouteTable.Routes.MapOwinPath("/fileBrowse", app =>
{
    string root = AppDomain.CurrentDomain.BaseDirectory;

    FileServerOptions options = new FileServerOptions();
    options.EnableDirectoryBrowsing = true;
    options.FileSystem = new PhysicalFileSystem(root);

    app.UseFileServer(options);
});

 

Le chemin ~/fileBrowse affichera la page que l’on a déjà vu précédemment.

Cette solution est intéressante si on a des besoins d’initialisation de certains middleware (Ioc…). Startup peut alors se déclencher avant que votre environnement ne soit tout à fait prêt. La route elle se déclenche lors du premier appel, l’appli est déjà entièrement lancée.

Le middleware FileServer

Nous avons installé le package StaticFile qui est fort mal nommé. StaticFile est juste un des middlewares présents dans ce package.

Le middleware FileServer utilisé dans les exemples qui précèdent joue un rôle particulier car il peut englober les différents middlewares du package, à savoir:

  • DefaultFiles
  • DirectoryBrowser
  • SendFile
  • StaticFile

C’est du paramétrage comme le montre le code de UseFileServer:

https://katanaproject.codeplex.com/SourceControl/latest#src/Microsoft.Owin.StaticFiles/FileServerExtensions.cs

 

On pourrait monter des pipelines plus simples dans certains scénarios. Par exemple si on a qu’un seul contenu à remonter (flux RSS par exemple), StaticFile peut suffire. Le code est très similaire à celui vu précédemment. La principale différence est que l’on passe un StaticFileOptions à la place de FileServerOptions.

Si vous souhaitez voir d’autres exemples:

http://aspnet.codeplex.com/sourcecontrol/latest#Samples/Katana/StaticFilesSample/Startup.cs

 

 

 

 

 

 

 

 

 

Publicités

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s