Nancy, un serveur web léger pour .Net

Publié le 14/06/2012, par Christophe Bonnevault dans Architecture, Valtech | 1 Commentaire

En tant que développeur .Net dans l’immense majorité des cas, lorsque nous avons un site web à développer, nous ne nous posons pas la question du choix du serveur applicatif : c’est tout naturellement vers IIS que nous allons nous tourner… restera juste à trancher entre le framework ASP.NET classique et le framework ASP.NET MVC.

Depuis maintenant plus de 10 ans que ASP.NET existe, avouons le, nous développeurs .Net, nous nous sommes largement laissés bercer par les améliorations continues apportées par Microsoft que ce soit au niveau du langage C# (4 version depuis 2002 où l’on a vu apparaître les types génériques, LINQ, les expressions lambda, le typage dynamique des variables, …) ou au niveau du framework ASP.NET (Master Pages, ASP.NET AJAX, ASP.NET MVC, …).

<troll>Pendant ces 10 années où nous, développeurs .Net étions satisfaits à 120% de nos outils et hyper productifs, d’autres développeurs étaient beaucoup moins satisfaits de leurs outils et en ont donc créés de nouveaux</troll>. C’est ainsi que l’on a vu apparaître de nombreux serveurs web légers comme lighttpd ou nginx qui permettent d’héberger des sites développés avec le framework Ruby On Rails par exemple. Des développeurs sont allés encore plus loin et ont créé Sinatra qui est un framework ruby minimaliste.

Un serveur web léger, oui mais pour quoi faire ?

Les disciples d’Aristote, me diront “qui peut le plus peut le moins” et tout ce qui peut être fait avec un serveur léger peut être fait avec IIS. C’est pas faux (comme le dirait Perceval), mais est-ce que dans certains cas on ne se sert pas d’un marteau pour écraser une mouche.

Imaginons par exemple que l’on veuille afficher les {x} derniers tweets de l’utilisateur {twittos} en utilisant l’url suivante : http://www.monsupersite.com/tweet/{twittos}/{x}

Si vous voulez faire ceci avec de l’ASP.NET “classique”, il va falloir créer une WebForm (page aspx pour laquelle vous n’aurez pas une maîtrise complète du html généré) qui prendra les paramètres {twittos} et {x} en GET ou en POST et ensuite créer un module http qui se chargera de faire le lien entre l’url demandée (à la mode REST) et votre WebForm. Au final, vous allez devoir travailler sur 4 fichiers (la vue et le Code-Behind de votre WebForm, le module http et le fichier de configuration de votre site web pour y déclarer le module).

Si vous voulez faire ceci avec de l’ASP.NET MVC, cela sera un peu plus simple (et surtout beaucoup plus propre), mais il vous faudra quand même créer un contrôleur, éventuellement un modèle (si vous voulez être très propre), une vue et ajouter une nouvelle route dans le fichier Global.asax.cs (la route qui existe par défaut étant /{controller}/{action}/{id}) soit entre 3 et 4 fichiers à manipuler.

Esssayons de voir si l’on ne peut pas faire la même chose mais d’une manière un peu plus legère. Nous allons pour cela utiliser Nancy qui est un framework léger très fortement inspiré de Sinatra. Dans notre démo nous allons auto-héberger Nancy dans une application console, mais sachez qu’il est tout à fait possible d’héberger ce que nous allons écrire dans IIS (pour les disciples d’Aristote très têtus).

#region Namespaces
using System;
using Nancy;
using Nancy.Hosting.Self;
#endregion
 
namespace NancyFirstDemo
{
    internal class Program
    {
        private static void Main()
        {
            var nancyHost = new NancyHost(new Uri("http://localhost:1234"));
            nancyHost.Start();
            Console.ReadLine();
            nancyHost.Stop();
        }
    }
 
    public class TweetModule : NancyModule
    {
        public TweetModule()
        {
            Get["/tweet/{twittos}/{x}"] = parameters => string.Format(
                "Ici on doit afficher les {0} derniers tweets de l'utilisateur {1}",
                parameters["x"],
                parameters["twittos"]);
        }
    }
}

Est-il nécessaire de devoir commenter ce code ? On voit qu’avec quelques lignes de code, il est possible d’instancier un serveur web et faire en sorte qu’il réponde correctement à une certaine catégorie d’urls. Pour ce qui veulent aller plus loin, il n’est pas bien compliqué d’enrichir le module pour qu’il fonctionne avec autre chose que du GET, et de renvoyer autre chose que du html (un fichier ou du json par exemple).

Le domaine des serveurs légers est actuellement en pleine ébullition dans le monde .Net tant au niveau des Hosts (Kayak, Gate,…) que des Frameworks (Nancy, SignalR). Ces outils ont l’avantage par rapport à d’autres d’être compatibles avec OWIN (Open Web Interface for .Net) qui est une spécification qui a pour but de définir des interfaces entre les différentes briques qui composent un serveur web. Je vous conseille de lire un billet publié par Louis DeJardin pour en savoir plus sur le sujet.

One Response to “Nancy, un serveur web léger pour .Net”

  1. jacob6u2k says:

    Whoa! This is often one specific of the extremely helpful sites We’ve ever arrive across with this subject. Generally Magnificent. We are furthermore a professional within this subject matter so we could realize your effort.

Leave a Reply