Welcome to NetFxFactory Sign in | Join | Help

articles

IIS module

IIS 7

Code source de l'article

Introduction

L’une des plus grosses différences dans l’architecture APACHE par rapport à IIS, c’est qu’Apache est basé sur des modules. En effet, la plupart des plugins pour IIS sont développés en ISAPI mais ne font pas réellement partie du serveur, alors que la modularité d’apache lui permet une grosse souplesse et un certain confort pour les hébergeurs. De plus il est assez complexe de développer des ISAPI car une certaine connaissance du C++ est absolument nécessaire étant donné que les ISAPI doivent être développé en C++. Avec IIS 7 les choses changent énormément. En effet IIS 7 est entièrement modulaire, et les modules peuvent être développés en .Net. On peut ainsi les ajoutés et les supprimés du serveur et ce directement dans le fichier Web.Config. Dans cet article, nous verrons comment développer un module qui listera un répertoire d’images et en fera une gallérie, ce qui permettra d’avoir juste a uploader l’image dans le répertoire pour être prise en compte par la gallérie. Une sorte de directory browsing amélioré fait pour les images.

Mon Premier module.

Dans ce développement on lira les fichiers qui sont dans le répertoire demandé et on affichera les images sous dans une galerie, ce qui sera toujours plus beau que la forme actuelle :

Actuellement on a ceci :

C’est les nouvelles erreurs d’IIS 7. En fait la directory browsing n’est pas activé ni autorisé sur le répertoire. On va donc l’activé. On va dans l’explorateur IIS 7 pour pouvoir l’activer. L’interface d’administration d’IIS se trouve dans les outils d’administrations dans le panneau de configuration. On a une interface un peu différente d’IIS 6 (en fait elle est radicalement différente):

Et oui finit le clic droit/propriétés, maintenant il faut activer les modules, pour activer des fonctionnalités. Pour cela on sélectionne « exploration de répertoire » ou « directory browsing » en anglais et on clic sur activer :

Comme vous pouvez le voir les modules sont paramétrable. Pour ce directory browsing on peu spécifier ce qui va être affiché.

Voici ce qui apparait maintenant quand on demande le répertoire.

Un Web.Config a été créé. Ce Web.Config possède le code suivant :

<?xml version="1.0" encoding="UTF-8"?>

<configuration>

<system.webServer>

<directoryBrowse enabled="true" />

</system.webServer>

</configuration>

Comme vous pouvez le voir un nœud qui se nomme system.webServer permet de configurer le serveur IIS 7 directement dans le fichier de configuration, c’est d’ailleurs ce que l’interface d’administration d’IIS 7 fait quand on active ou paramètre des modules. C’est dans le web.Config que l’on fera le déploiement de notre module plus tard. Mais commençons le développement. Première chose à faire, c’est télécharger le IIS 7 Manages module sur le site IIS.NET à l’adresse suivante http://www.iis.net/downloads/default.aspx?tabid=34&g=6&i=1302

Apres l’avoir installé, je lance visual studio et je créé mon projet de type IIS 7 managed module :

Lorsque j’ai fait cela le template de projet m’a automatiquement créé une classe qui hérite de IHttpModule, un fichier readme qui me permet de savoir ce que je dois faire pour créer un module et un fichier Web.config pour ajouter le module à mon site.

Le code de mon module sera relativement simple. On va commencer par gérer l’événement BeginRequest de l’objet HttpApplication. On va donc ajouter ceci dans la fonction Init :

application.BeginRequest += new EventHandler(application_BeginRequest);

Ce code doit vous êtes très compréhensible, c’est une gestion courante d’événement. Ensuite dans le OnBeginRequeste on va recupérer l’application courante, le contexte, l’objet request et response:

void application_BeginRequest(object sender, EventArgs e)

{

HttpApplication objApplication = (HttpApplication)sender;

HttpContext objContext = objApplication.Context;

HttpRequest objRequest = objContext.Request;

HttpResponse objResponse = objContext.Response;

}

L’objet Resquest nous permettra de savoir le chemin du répertoire demandé et l’objet response nous permettra de renvoyer la page HTML formatée avec les images.

Bien Maintenant je vais mettre en forme toutes les images contenues dans mon répertoire:

Premiérement on récupére les informations du répertoire avec un DirectoryInfo :

 

DirectoryInfo objDirInfo = new DirectoryInfo(objRequest.PhysicalPath);

Ensuite on boucle sur le répertoire pour récupérer les informations des images et les afficher:

if (objDirInfo.Exists)

{ 

foreach(FileInfo objFile in objDirInfo.GetFiles())

{

if (objFile.Extension == ".png" || objFile.Extension == ".jpg" || objFile.Extension == ".gif")

{

objResponse.Write("<a href='" + objFile.Name + "'><img src='" + objFile.Name + "' width=100></a>");

}

}

}

Ceci est assez basique on peut formatter la page pour quelle soit plus belle, voici par exemple une page avec une plus belle mise en forme :

 

void application_BeginRequest(object sender, EventArgs e)

{

HttpApplication objApplication = (HttpApplication)sender;

HttpContext objContext = objApplication.Context;

HttpRequest objRequest = objContext.Request;

HttpResponse objResponse = objContext.Response;

DirectoryInfo objDirInfo = new DirectoryInfo(objRequest.PhysicalPath);

StringBuilder strBuild = new StringBuilder();

strBuild.Append("<html><head><title>");

strBuild.Append(objRequest.Path);

strBuild.Append("</title></head><body><table><tr><td colspan='3'><h1>");

strBuild.Append(objRequest.Path);

strBuild.Append("</h1></td></tr>");

if (objDirInfo.Exists)

{

FileInfo[] objArFile = objDirInfo.GetFiles();

for (int miind = 0; miind < objArFile.Length; miind++ )

{

if (miind % 3 == 0 && miind<objArFile.Length-1)

{

strBuild.Append("<tr>");

}

FileInfo objFile=objArFile[miind];

if (objFile.Extension == ".png" || objFile.Extension == ".jpg" || objFile.Extension == ".gif")

{

Image objImag=Image.FromFile(objFile.FullName);

strBuild.Append("<td><a href='");

strBuild.Append(objFile.Name);

strBuild.Append("'><img border=0 src='");

strBuild.Append(objFile.Name);

strBuild.Append("' width=100></a><br>");

strBuild.Append("Width : " + objImag.Width + " Height :" + objImag.Height);

strBuild.Append("</td>");

}

if (miind % 3 == 0 && miind < objArFile.Length - 1 && miind>0)

{

strBuild.Append("</tr>");

}

}

strBuild.Append("</table></body></html>");

objResponse.Write(strBuild.ToString());

}

}

On ajoute l’appel a notre module dans le fichier de configuration :

<?xml version="1.0" encoding="UTF-8"?>

<configuration>

<system.webServer>

<modules>

<remove name="DirectoryListingModule" />

<add name="DirectoryListingModule" type="MyIIS7Modules.MyModule" />

</modules>

</system.webServer>

</configuration>

Dans ce fichier je commence par retirer le module de DirectoryBrowsing pour rajouter le mien.

Et voila le résultat :

Et si on incluait WPF/E SilverLight

SilverLight est le nom officiel de la technologie WPF/E. Cette nouvelle technologie permet une plus grande interactivité sur le web.
Je vais reprendre le page turn du Sample Pack de silver light.
Les modifications apportées au Page turn sont :

  • Tout le code sur une page, j’ai fusionné les javascript, le xaml et le HTML dans la même page
  • Les images peuvent avoir n’importe quel nom et plus un nom commençant par Page

Pour des raisons de facilité j’ai tout mis dans un fichier texte compilé avec le module.
Voici donc mon nouveau directory browsing :

Le code se trouve dans la partie download du site.

Conclusion :

La modularité nouvelle d’IIS 7 permet de faciliter grandement le développement sur cette plateforme. En plus comme tout est dans le fichier de configuration du site la simplicité de déploiement, d’activation et de désactivation des modules rend le développement très souple. Le serveur web est entièrement personnalisable et customisable. Je conseille vivement la lecture des différents articles sur le site IIS.NET.

Published Sunday, April 22, 2007 12:33 PM by xvanneste
Filed under: , ,

Comments

 

VANNESTE Xavier said:

Je me suis amuser a reprendre le Page turn du sample pack de SilverLight pour en faire un Directory Browsing

April 23, 2007 4:25 AM
 

sblancher said:

Je suis tout nouveau et débute en XAML, mais est-il possible pour une appli avec 10 écrans et faire touner les écrans comme les photos ?

Il s'agit de faire une applie sur un écran tactile et donc la navigation d'écran en écran en les faisant tourner comme des pages serait tip top la classe !

Est-ce possible ?

March 12, 2008 3:50 AM
Anonymous comments are disabled

This Blog

Syndication

Powered by Community Server (Personal Edition), by Telligent Systems