lundi 17 novembre 2008

Redirection et Simplification d'URL sous Sharepoint

C’est une problématique qui survient relativement souvent dans des organisations de taille importante (> 1.000 users) utilisant des sites collaboratifs comme WSS ou MOSS :

Il est nécessaire de structurer nos collections de sites Sharepoint à l’aide de chemins gérés, du type : http://nom_serveur/nom_direction/nom_equipe/nom_projet/

Cela permet de regrouper les sites collaboratifs par direction, par équipes… (dans la mesure où ces projets ne sont pas transversaux à plusieurs directions, bien sûr).

Derrière, niveau stockage SQL, ça permet également de regrouper les collections de sites par base de données (exemple : une base par direction + une base pour les projets transverses).

Le problème, c’est quand on ne se souvient pas de l’adresse complète, ou alors, que l’on souhaite communiquer de manière évènementielle sur un site donné : difficile d’utiliser ces URL à rallonge. On a besoin, dans certains cas, de définir des ‘raccourcis’ vers certains sites, avec une URL simplifiée facile à retenir du type : http://nom_serveur/raccourci , ou encore http://mon_serveur/evenement.

Il existe plusieurs solutions :

- utiliser un annuaire de site (pratique, exhaustif, permet de trier ou filtrer, mais cela ne règle pas le problème de complexité de l’URL)

- ne pas utiliser de chemins gérés, on met toutes les collections de sites directement derrière le nom du serveur (absolument pas recommandé)

- utiliser un DNS particulier (il faut alors faire intervenir les admins du DNS d’entreprise à chaque nouveau besoin de raccourci)

- utiliser un alias IIS avec une redirection (solution plus « propre », c’est la solution que je vais détailler ici).


Exemple :
On souhaite rediriger http://serveur:port/direction_1/equipe_1/projet/mon_site_collaboratif vers http://serveur:port/genial

1. A la main, cela donne :

- Ouvrir IIS manager,
- sélectionner le site web Sharepoint sur lequel on souhaite positionner la redirection. (partie « serveur:port », avec ou sans numero du port)

- Clic droit, nouveau > répertoire virtuel
- Clic sur « suivant »
- Saisir le nom de l’alias (= le nom du raccourci, ici « genial »), puis « suivant »


- Indiquer un répertoire physique (peu importe, on va le changer ensuite)
- Cocher « lecture », « executer », puis « suivant » et « fin »

Ensuite, sur le répertoire virtuel nouvellement créé, faire clic droit, « propriétés ».

- Onglet « repertoire virtuel », cocher le 3e radio bouton « une redirection vers une URL », puis indiquer l’adresse vers laquelle rediriger, à savoir http://serveur:port/direction_1/equipe_1/projet/mon_site_collaboratif.

- Cocher la case d’option « l’URL exacte ci-dessus »
- Cliquer sur OK

Voilà, la redirection est prête !

2. Via code C# : application de type console

Notes :

  • cette appli console doit tourner sur le serveur Sharepoint avec un compte qui a les droits sur IIS
  • dans le cas présent, cela concerne une single server farm. Sinon, l’opération est à répéter sur chaque frontal web.
  • je vous laisse le soin d’indiquer le répertoire correct de votre IIS

using
System;
using
System.Collections;
using System.Text;
using System.IO;
using System.DirectoryServices;
using System.Reflection;
using
System.Runtime.InteropServices;

namespace Ajout_IIS_Alias

{

class
Program


{

static void Main(string[]
args)

{

//
creation virtual dir


CreateVDir("IIS://serveur:port/W3SVC/2065292710/Root", "genial",
"C:\\Inetpub\\Wwwroot", "
http://serveur:port/direction_1/equipe_1/projet/mon_site_collaboratif");

//
suppression virtual dir


//DeleteVDir("IIS://serveur:port/W3SVC/2065292710/Root",
"genial");


Console.ReadLine();

}


static void
CreateVDir(string metabasePath, string vDirName, string physicalPath, string
httpRedirect)

{


// metabasePath is of the form
"IIS://<servername>/<service>/<siteID>/Root[/<vdir>]"


// for example "IIS://localhost/W3SVC/1/Root"



//
siteID can be found via
http://weblogs.asp.net/owscott/archive/2005/07/29/421058.aspx


// vDirName is of the form "<name>", for example,
"MyNewVDir"


// physicalPath is of the form
"<drive>:\<path>", for example,
"C:\Inetpub\Wwwroot"




Console.WriteLine("\nCreating virtual directory {0}/{1}, mapping the Root
application to {2}:", metabasePath, vDirName, physicalPath);


try


{


DirectoryEntry site = new DirectoryEntry(metabasePath);


string className = site.SchemaClassName.ToString();


if ((className.EndsWith("Server"))
(className.EndsWith("VirtualDir")))


{


DirectoryEntries vdirs = site.Children;


DirectoryEntry newVDir = vdirs.Add(vDirName, (className.Replace("Service",
"VirtualDir")));


newVDir.Properties["Path"][0] = physicalPath;


newVDir.Properties["HttpRedirect"][0] =
((object)httpRedirect);


newVDir.Properties["AccessScript"][0] = true;


// These properties are necessary for an application to be
created.


newVDir.Properties["AppFriendlyName"][0] = vDirName;


newVDir.Properties["AppIsolated"][0] = "1";


newVDir.Properties["AppRoot"][0] = "/LM" +
metabasePath.Substring(metabasePath.IndexOf("/",
("IIS://".Length)));


newVDir.CommitChanges();


Console.WriteLine(" Done.");


}


else


Console.WriteLine(" Failed. A virtual directory can only be created in a site or
virtual directory node.");


}

catch
(Exception ex)


{


Console.WriteLine("Failed in CreateVDir with the following exception: \n{0}",
ex.Message);


}

}

static void DeleteVDir(string
metabasePath, string vDirName)

{


// metabasePath is of the form
"IIS://<servername>/<service>/<siteID>/Root[/<vdir>]"


// for example "IIS://localhost/W3SVC/1/Root"


// vDirName is of the form "<name>", for example,
"MyNewVDir"


// physicalPath is of the form
"<drive>:\<path>", for example,
"C:\Inetpub\Wwwroot"


Console.WriteLine("\nDeleting virtual directory {0}/{1}:", metabasePath,
vDirName);


try


{


DirectoryEntry site = new DirectoryEntry(metabasePath);


string className = site.SchemaClassName.ToString();


if ((className.EndsWith("Server"))
(className.EndsWith("VirtualDir")))


{


DirectoryEntries vdirs = site.Children;


vdirs.Remove(vdirs.Find(vDirName, className));


site.CommitChanges();


Console.WriteLine(" Done.");


}


else


Console.WriteLine(" Failed. A virtual directory can only be created in a site or
virtual directory node.");


}

catch
(Exception ex)


{


Console.WriteLine("Failed in DeleteVDir with the following exception: \n{0}",
ex.Message);


}

}


}

}

Enfin, le developpement l’idéal serait ensuite :

- une liste sharepoint dans laquelle on saisi les mots-clés et les adresses de redirection associées
- un timer job sharepoint qui tourne tous les soirs par ex, qui parse la liste créée ci-dessus, et qui ajoute/supprime les réperoires virtuels correspondants à chaque frontal de la ferme.

-

Enjoy !

Aucun commentaire: