Accueil Nos publications Blog Créer sa première application avec NancyFx

Créer sa première application avec NancyFx

logo

Nancy est un framework très léger permettant de construire des applications Web sur .Net et Mono. Son “super-duper-happy-path ” permet de fournir une réponse à toutes les demandes lui arrivant. Pour ce faire, tout dans Nancy est paramétré avec des conventions et des règles par défaut. Ceci permet en quelques minutes d’avoir un site Web en partant de zéro.

 

La suite de cet article nous permettra de mettre en pratique les avantages  de Nancy FX, notamment :

  • sa modularité
  • sa simplicité
  • le routage des requêtes HTTP très intuitif
  • la facilité de son hébergement (IIS, application console, Mono, …)

Notre première application Web avec Nancy est un message au monde : HelloWorld.

Hébergement

NancyFx  ayant été développé pour être exécuté dans de multiples environnements (Windows, Linux, Raspberry Pi, …), il est nécessaire de choisir un Host (hébergeur) et  un serveur Web permettant d’exécuter notre application. L’hébergeur peut être vu comme un adaptateur entre  l’environnement d’hébergement et le serveur. Le serveur Web, quant à lui, a pour but  l’écoute des requêtes clientes et le routage de celles-ci aux couches applicatives.

schema hosting

Pour l’hébergement de l’application, j’ai choisi  Katana, il s’agit de l’implémentation de OWIN par Microsoft. OWIN (Open Web Interface for .NET) est un standard qui définit l’interface entre les serveurs Web et les applications Web. Les objectifs de cette interface sont :

  • de découpler serveur et application
  • de simplifier le développement et la consommation d’application web
  • de simplifier le portage d’une application web sur plusieurs Host, voir plateformes ou même OS

Pour de plus amples informations sur OWIN et Katana, je vous conseille de lire les articles  suivants [ASP.NET] OWIN et [ASP.NET] Katana écrits par Léonard Labat.

 Hello world!

Pour commencer, je vais créer une application  Web ASP.Net vide :

create_project

Je choisis le template vide :

create_project2

Et j’obtiens le projet vide suivant :

empty_project2

Je vais  maintenant supprimer toutes les références inutiles au fonctionnement de l’application pour ne garder que l’essentiel : System et System.Core. Le but est double :

  • avoir l’application la plus légère possible
  • montrer qu’une application Owin/NancyFx  à besoin de peu de librairies pour fonctionner

references

Je vais ensuite ajouter Katana à mon projet. Pour ce faire, j’utilise la console Package Manager NuGet  afin d’importer le package Microsoft.Owin.Host.SystemWeb (install-package Microsoft.Owin.Host.SystemWeb). Cela va ajouter les librairies Owin, Microsoft.Owin et Microsoft.Owin.Host.SystemWeb au projet.

J’ajoute ensuite NancyFx, une nouvelle fois, via la console Package Manager NuGet, j’importe le package Nancy.Owin (install-package Nancy.Owin ). Cela va ajouter les librairies Nancy et Nancy.Owin.

Je me retrouve donc avec la liste de références suivante dans mon projet :

references-nancy

La classe de démarrage

Si je compile mon projet et que je l’affiche dans mon navigateur Web, j’obtiens la page d’erreur suivante :

error-page

Le message d’erreur me signale qu’aucune librairie contenant un OwinStartupAttribute  ou une classe Startup n’a été trouvée.

En effet, toute application OWIN doit posséder  une classe de démarrage où sont définis les composants à utiliser dans le pipeline de l’application. Il y a trois manières de déclarer cette classe de démarrage :

La convention de nommage :

Katana cherche une classe nommée Startup dont le namespace correspond au nom de l’assembly (nom de l’application) ou au  namespace global.

L’attribut OwinStartup :

Cet attribut surcharge la convention de nommage, en définissant la classe qui doit être utilisée au démarrage de l’application. Il doit être placé dans le fichier contenant la classe de démarrage.  Dans l’exemple ci-dessous c’est la classe MyStartup de l’espace des noms MyNamespace qui sera la classe de démarrage de l’application.

[assembly:OwinStartup(typeof(MyNamespace.MyStartup))]

L’élément appSetting dans le fichier de configuration :

L’appSetting surcharge la convention de nommage et l’attribut OwinStartup. Vous pouvez donc avoir plusieurs classes de démarrage, chacune définie à l’aide de l’attribut OwinStartup et choisir dans le fichier de configuration celle qui sera chargée au démarrage de votre application en utilisant la syntaxe suivante :

<appSettings>
<add key=“owin:appStartup”value=“MyNamespace.MyStartup”/>
</appSettings>

Pour renseigner l’assembly dans laquelle se trouve la classe de démarrage, if faut utiliser la syntaxe suivante :

<add key=“owin:appStartup”value=“MyNamespace.MyStartup, MyAssembly”/>

Vous pouvez aussi définir un nom plus parlant pour votre classe de démarrage comme dans l’exemple ci-dessous :

 <appSettings>
<add key=“owin:appStartup”value=“StartupClass”/>
</appSettings>

il vous faudra alors l’utiliser avec un attribut OwinStartup qui associe ce nom avec une classe de démarrage comme le montre l’exemple ci-dessous :

[assembly:OwinStartup(StartupClass,typeof(MyOtherNamespace.OtherStartup))]

Astuce : Si votre classe Startup n’a pas pour namespace le nom de l’assembly, vous pouvez, via un élément appSetting, définir dans quels namespace et assembly la trouver:

<add key=“owin:appStartup”value=“MyNamespace.Startup, MyAssembly”/>

 

Pour des raisons de simplicité, je vais  créer une classe Startup dans mon projet.

startup_class

Notez que l’utilisation de Nancy se fait via une seule ligne de code dans la méthode Configuration : appBuilder.UseNancy(); 

UseNancy est une méthode d’extension  de IAppBuilder définie dans le package Nancy.Owin. Elle  va simplement  enregistrer le middleware NancyFx dans Katana, via la méthode d’extension Use définie dans  Katana, comme le montre l’extrait de code source ci-dessous :

UseNancy

NancyModule

Je relance mon application dans mon navigateur Web et j’obtiens cette fois-ci une magnifique page d’erreur 404 générée par Nancy :

nancy-404

Elle me signale qu’aucune ressource n’est  associée à ma requête, je vais donc créer un module Home (contrôleur pour Nancy) afin de pouvoir retourner mon “bonjour au monde”.

HomeModuleClass

Pour être “référencée” par Nancy, ma classe HomeModule doit hériter de la classe NancyModule. En effet, durant le démarrage de l’application,  le Bootstrapper de Nancy “scanne”  toutes les assembly présentes dans l’application à la recherche de toutes les classes héritant de la classe NancyModule et met en cache l’information quand il en trouve une. Vous pouvez bien sur déclarer autant de modules que vous le souhaitez dans votre application.

Mais revenons sur la façon dont est déclarée la réponse à la requête sur l’URL racine de mon site.

La ligne de code suivante : Get[“/”] = _ => “Hello world!”;  permet de définir  Hello world! comme réponse  pour toute requête GET  sur l’URL racine du site.   Tous les paramètres de la requête sont transmis à l’action à effectuer  via  . Ici la requête n’en possède pas.

L’exemple d’appel suivant : https://monSite/person/1 est une requête qui possède comme paramètre la valeur 1.

Pour la traiter, il faudra définir dans notre classe HomeModule (ou dans un autre module) le code suivant :

Get[“/person/{id}”] = _ => { return “l’id demandé est” + _.id;};

que l’on pourrait traduire de la façon suivante: pour toute requête GET ayant pour format URL_ROOT/person/id, le message ” l’id demandé est id ” sera retourné.

Appréciez la simplicité et l’élégance avec laquelle sont déclarées toutes ces routes !

 

Et voici le résultat dans le navigateur Web, un magnifique Hello World! :

hello world

Et voilà, je viens de créer ma première application Web avec NancyFx, et cela ne m’a pris que quelques minutes.

 Self Hosting

Héberger mon site Web dans une application console aurait été tout aussi simple.

A la place du package Microsoft.Owin.Host.SystemWeb, il faut installer toujours via la console PM Nuget, les packages Microsoft.Owin.Hosting et Microsoft.Owin.Host.HttpListener.

Et dans la méthode  Main saisir le code ci-dessous (Startup correspondant à la classe définie plus haut dans l’article).

appli-console

 En Conclusion

Voilà, nous en avons fini avec ce premier tutorial sur NancyFx. Dans mon prochain article, je vous expliquerai comment, toujours avec NancyFx, créer un site Web en utilisant un moteur de vues, et des ressources statiques (css, javascript).