Afin de simplifier le démarrage un GitHub Codespace a été préconfiguré et nécessite un compte GitHub. Notons que les étudiants bénéficient de certains avantages, dont des heures Codespace supplémenaires, via le programme GitHub Student Developer Pack.
-
Effectuez un fork privé de ce repository, fork sur lequel vous travaillerez pour toute la durée du TP.
-
Assurez-vous d'être dans votre fork en vérifiant l'URL du navigateur.
-
Créez votre Codespace en cliquant sur Create a codespace on main. Choisissez la plus petite machine possible: le TP ne demande pas beaucoup de ressource car les tâches de calcul sont surtout effectuées par les bases de données auquelles vous vous connecterez. Si vous utilisez Firefox, désactivez l'Enhanced Tracking Protection sur l'URL de votre Codespace sans quoi vous ne pourrez vous y connecter.
Installez les éléments suivants:
- .NET Core 8.0 (vérifiez que la version de .NET est supportée par Azure Functions)
- Visual Studio Code
- Azure Functions extension for Visual Studio Code
- Suivez les instructions officielles pour créer votre premier programme en .NET.
⚠️ Ajoutez le paramètre--use-program-mainavec ledotnet newpour créer un programme initial avec une structure qui vous facilitera le reste du TP. - Naviguez vers le dossier sample1 et modifiez le programme en y ajoutant une classe Personne avec (Testez le snippet prop puis la touche TAB ):
- Une propriété nom de type string
- Une propriété age de type int
- (optionnel) Une méthode
Hello(bool isLowercase)qui renvoit "hello name, you are age" si isLowercase vaut true, ou la même chaîne mais en majuscule sinon. - Créez une variable de type Personne en lui assignant un nom et un âge (docs)
- Affichez à l'écran hello name, you are age (au lieu du Hello World! d'origine)
Pour recompiler et exécuter votre code, depuis le dossier du projet:
dotnet run
Pour recompiler uniquement
dotnet build
Comme tout langage moderne, .NET bénéficie d'une communauté de développeurs partageant des librairies prêtes à l'emploi, en l'occurence NuGet. Dans cette exercice nous allons utiliser la librairie la plus populaire de NuGet: newtonsoft.json qui permet de facilement travailler avec des données au format json.
- Sur la base du programme Hello World, installez le package newtonsoft.json en exécutant la commande
dotnet add package Newtonsoft.Json - Modifiez le programme afin de sérialiser dans une chaîne de caractère la variable de type Personne créée précédemment en utilisant la méthode
JsonConvert.SerializeObject(n'oubliez d'inclure le namespace adéquat en ajoutantusing Newtonsoft.Jsonen tête de fichier) - (optionnel) Formattez la sérialisation précédente en utilisant l'option
Formatting==Indented - Affichez le json à l'écran à la place du texte précédemment présent
Nous allons maintenant utiliser le package ImageSharp.
- Toujours dans le même dossier, ajoutez le package SixLabors.ImageSharp
- En vous basant sur ces exemples, redimensionnez une image (ou effectuez une autre transformation!) et sauvegardez-là dans le dossier de votre choix. Pour préciser des noms de chemin Windows, je vous conseille la syntaxe @"c:\mon chemin\monimage.jpeg" qui permet de garder lisibles les backslashes
- (optionnel avancé) La gestion du parallélisme et de l'asynchrone est un point fort de .NET. Utilisez Parallel.ForEach pour redimensionner plusieurs images en parallèle. Mesurez les performances.
Nous allons maintenant porter ce petit programme pour pouvoir l'héberger au sein d'une Azure Function. Elle se déclenchera sur un appel HttpTrigger en POST.
- Créez un nouveau dossier local ResizeFunction
- Retournez à la page d'accueil du portail
- Créez une Function App (ex: nomprenom-fa) de type Consumption
- Ciblant .NET 8 (LTS) in-process model
- Sur la région France Central
- Système d'exploitation Linux
- Laissez Azure créer un nouveau Storage Account pour héberger le code de la fonction
- Sélectionnez un hosting Consumption
- Dans l'onglet Azure de Visual Studio Code, section FUNCTIONS créez un nouveau projet Azure Functions depuis Visual Studio Code
- Dans le dossier ResizeFunction
- Choisissez C#
- Sélectionnez le runtime .NET 8.0 - il doit correspondre à celui sélectionné lors de l'étape 2
- Faites bien attention et sélectionnez
HttpTrigger(quelques secondes sont nécessaires à l'affichage). C'est ce qui permet d'exposer la fonction en tant qu'API http. - Nommez votre fonction
ResizeHttpTrigger - Choisissez un namespace à votre guise
-
- Sélectionnez Anonymous comme type d'authentification
- Depuis le dossier ResizeFunction, ajoutez le package ImageSharp.
- Modifiez le fichier afin de récupérer le corps (body) de la requête et le charger en tant qu'image dans ImageSharp (aide)
-
Pour renvoyer les octets de la nouvelle image en tant que réponse à la requête, utilisez return new FileContentResult(targetImageBytes, "image/jpeg");
-
Ajoutez les paramètres d'URL h et w qui permettent à l'appelant de spécifier les dimensions cibles. Ne modifiez pas les noms de ces paramètres: gardez bien w et h car cela est utilisé pour la notation.
-
Si vous avez des difficultés, collez le contenu du fichier préparé qui implémente pour vous les éléments très techniques/tuyaux
-
Complétez les différents TODO
-
Récupérez les paramètres w et h de la requête avec
req.Query[key]et utilisez les respectivement comme dimensions cibles pour les largeurs et hauteur de la nouvelle image. Attention au typage! -
Les MIME types sont documentés ici Récupérez l'adresse de votre fonction depuis le portail Azure en allant sur votre Azure Function, dans la section Functions, sélectionnez ResizeHttpTrigger et cliquez sur le bouton Get Function Url en haut de la page
-
- Déployez votre code et appelez fonction avec curl ou via un testeur de web service tel que Postman.
curl --data-binary "@chaussures_abimees.jpg" -X POST "https://votrefonction.azurewebsites.net/api/ResizeHttpTrigger?w=100&h=100" -v > output.jpeg
- (optionnel) Changez AuthorizationLevel.Anonymous à AuthorizationLevel.Function puis récupérez la clé d'API de votre fonction sur le portail Azure. Modifiez ensuite votre requête pour qu'elle s'authentifie avec succès.
Conseil: Veillez à ce que votre fonction soit propre avec notamment une bonne gestion des erreurs (notamment des paramètres d'entrée invalide) et des retours de statuts HTTP adéquats. Votre fonction ne devrait par exemple jamais renvoyer de statuts 500.
Le web service étant désormais déployé, voyons comment le réutiliser dans un autre scénario. Nous allons pour cela créer une Logic App (également du serverless) qui surveillera le container d'un Blob Storage Account et déclenchera un appel à notre Azure Function .NET dès qu'un fichier y sera déposé.
- Depuis le portail Azure, crééz une Logic App (Workflow, Consumption)
- Implémentez la Logic App depuis le concepteur graphique (Designer)
- Vous pouvez utiliser directement le connecteur natif Azure Function, ou le connecteur permettant d'effectuer des appels http (optionnel: essayez les deux). Pour passer les paramètres w (width, largeur) et h (height, hauteur), utilisez les paramètres Requêtes de ces connecteurs
- Stockez la sortie de la function dans un nouveau blob situé dans un container différent du même Storage Account et nommez le nouveau blob
resized-<nom_du_fichier_source>.jpeg(que se passerait-il si l'on stockait le nouveau fichier dans le même container que l'ancien?) - Utilisez le bouton Voir le code pour regarder le fichier décrivant l'application. Notez qu'il s'agit d'un langage déclaratif et non impératif.
- Testez votre application en déposant plusieurs fichiers dans le container du Storage Account
- (optionnel) Ajoutez une condition filtrant les fichiers entrant, en s'assurant que le traitement n'ai lieu que s'ils ont pour extension .jpg, .png, ou .bmp.
- (optionnel) Le nommage préalablement choisi n'est pas toujours correct car les fichiers créés sont au format jpeg alors que les fichiers sources peuvent être dans un autre format d'image. Pour corriger cela tout en rapprochant alphabétiquement le nom du fichier source et du fichier créé, modifiez le nommage du nouveau fichier ainsi:
[nom_du_fichier_source_sans_extension]-resized.jpeg
Le TP sera noté et rendu de la manière suivante:
- Par binôme ou trinôme
- Pensez à bien gérer les exceptions
- Bien suivre les instructions car une partie de l'évaluation est automatisée.
- Le rendu doit s'effectuer comme décrit ci-dessous.
-
Envoi du rendu par mail:
- Destinataire: mon adresse ...@centralesupelec.fr
- Sujet:
TPDOTNETsuivi de vos noms (ex:TPDOTNET - alice, bob, charles) - CC: Les membres du binôme ou trinôme
- En pj. l'unique fichier de votre Azure Functions (
ResizeHttpTrigger.cs) - Corps du message:
- L'URL https de votre fonction
- Le lien vers votre Logic App (celle qui apparaît dans la barre d'adresse du navigateur quand vous êtes sur votre Logic App)
- (bonus) les liens vers les vidéos
-
Les bonus sont soumis sous forme de vidéo Youtube unlisted faisant au plus 3 minutes chacune (le plus court le mieux). Si nécessaire, exécutez le code localement sur votre poste ou augmentez le nombre de CPU de votre Codespace pour mieux mettre en avant l'amélioration des performances.
- Bonus 1 : une vidéo démontrant le gain de performance obtenu par la parallélisation sur le traitement local (section 3.3)
- Bonus 2 : une vidéo démontrant le fonctionnement de la Logic App lisant des images depuis le Blob Storage (dépôt de plusieurs fichiers, détails du run de la Logic App, apparition des fichiers traités dans le Blob Storage)
-
Note: Vous pouvez utiliser PowerPoint pour capturer facilement votre écran. Vous pouvez partager la vidéo sur Teams.

