Mono et le déploiement d’une application web .NET sous Linux (1/2)

En règle générale, lorsque l’on évoque un « projet .NET », on pense à Windows Server, Visual Studio ou encore SQL Server. Soit un environnement de travail et de production assez coûteux.

Pourtant, depuis 2004 (soit environ deux ans après la sortie de la première mouture du Framework .NET), un framework libre et gratuit permettant de développer des projets .NET existe : il s'agit de Mono. Outre le fait qu'il soit libre et gratuit, Mono permet de développer et d'exécuter ces projets sur des systèmes d’exploitation tels que Linux ou Mac OS X, que le langage utilisé soit du C# ou du VB.NET, ou encore, que le projet soit un logiciel ou un site Web. Actuellement disponible en version 2.10.1 (2.6.7 dans les paquets Ubuntu), Mono ne cesse d'être mis à jour, afin de suivre logiquement les évolutions apportées au .NET originel de Microsoft.

Nous verrons donc ici comment « porter » une application Web évoluant dans un environnement Windows vers un environnement Linux, tel qu'Ubuntu.

Installation de Mono et de MonoDevelop

Depuis quelques temps, Ubuntu intègre automatiquement mono-runtime : l'outil qui permet l'exécution des projets .NET. Cependant, pour notre exemple, nous aurons besoin des outils de développement de Mono.

Les bibliothèques de développement et autres dépendances seront installées à partir du paquet mono-complete. Cette installation s'effectue facilement via le gestionnaire de paquets Synaptics d'Ubuntu.

En ce qui concerne l'environnement de développement, on pourra compter sur MonoDevelop, qui s’installe également avec Synaptics (paquet nommé monodevelop). Les utilisateurs de Visual Studio devraient pouvoir retrouver leurs habitudes avec MonoDevelop. Ce dernier conserve en effet la plupart des outils et des raccourcis claviers (attention tout de même car certains sont différents). Comme Visual Studio, MonoDevelop possède un système de serveur stand-alone qui permet de déployer un projet sans avoir à installer un serveur logiciel tel qu’Apache ou IIS. On lui trouvera certainement des lacunes sur certains points, mais il faut garder à l’esprit que MonoDevelop servira surtout à debugger une application, plutôt qu’à la développer. A noter enfin que MonoDevelop est également beaucoup moins lourd que Visual Studio. Avec une centaine de méga-octets, l'ensemble Mono/MonoDevelop est bien plus léger que son équivalent chez Microsoft ...

Chargement d'un projet existant et problèmes rencontrés

Pour illustrer cet exemple, nous allons ouvrir une solution Web dont le développement est terminé. Il s'agit d'un site Internet permettant de gérer du personnel, développé en C#, et s'appuyant sur le Framework ASP.NET MVC v1.0. Sa base de données contient déjà quelques informations de test, tels que des comptes utilisateurs. A noter enfin que ce projet aura bientôt deux ans et qu’ASP.NET MVC v1.0 est sorti en mars 2009. On peut donc espérer que Mono couvre toutes les classes et fonctions de base utilisées par ce projet.

L'ouverture de la solution s'effectue simplement en ouvrant le fichier « .sln ». Le projet est chargé sans problème. C’est un premier point positif.

Après avoir modifié le Web.config afin de se connecter à la bonne base de données (dans un premier temps, on se connecte à une base de données SQL Server), on effectue la compilation de la solution. Celle-ci s'effectue avec succès du premier coup et redirige l'utilisateur vers la page d'accueil du site ! Cette dernière présente une interface de connexion où l'utilisateur peut entrer son identifiant et son mot de passe.

Cependant, au moment de se connecter, un message d'erreur d’apparaît :

Object reference not set to an instance of an object

Après investigation - grâce notamment aux outils de debug de MonoDevelop qui n'ont rien à envier à ceux de Visual Studio - il s'avèrera que le problème vient d'une requête LINQ. La requête en question concerne la vérification du mot de passe. On appelle en effet une fonction de hachage, provenant d'une classe static, qui ne plaît visiblement pas à Mono. On contournera donc le problème en enregistrant le résultat produit par la fonction dans une variable, avant son utilisation dans la requête.

Réjouissance de courte durée puisque l'erreur suivante apparaît avant même la fin de la connexion au compte utilisateur :

DateTime Member access Today not supported

L’erreur provient d’une comparaison de dates s'appuyant sur la méthode static DateTime.Today, toujours dans une requête LINQ. Là aussi, en passant par une variable, on contourne l'erreur. A noter tout de même que DateTime.Now est fonctionnel dans la requête LINQ...

Ce sera la dernière erreur rencontrée pour cette étape. Nous accédons ensuite à notre page d'accueil, et après quelques minutes de navigation dans les différentes pages, aucune autre erreur n'apparaît.

Conclusion

Pour des outils gratuits, Mono et MonoDevelop ont de quoi satisfaire de nombreux développeurs et couvrir de nombreux besoins. Hormis les quelques anomalies citées plus haut, on voit que le passage d'un environnement Windows à Linux est possible sans trop de soucis. D'ailleurs, n'aurait-on pas plus de difficultés avec une transition entre deux versions de Visual Studio ou du Framework .NET ?

Toujours est-il qu’une mauvaise gestion des classes ou des méthodes static semble s’être glissée dans cette version de Mono… On peut aussi regretter que les deux erreurs rencontrées ne soient pas signalées lors de la compilation par exemple. Cela laisse penser que Mono souffre de quelques petites lacunes, mais qui sont peut-être déjà corrigées dans les versions non prises en charges par Ubuntu, ou qui le seront dans un futur proche.

La prochaine étape de ce billet consistera à s'affranchir de SQL Server en migrant vers un autre système de gestion de base de données, comme PostgreSQL. Nous procèderons ensuite à la publication du site en utilisant un serveur logiciel tel qu’Apache.

Un commentaire

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Captcha *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.