Passer au contenu du pied de page
.NET AIDE

Azure.Messaging.ServiceBus Exemple C# (Comment ça fonctionne)

Dans le paysage numérique interconnecté d'aujourd'hui, une communication efficace est la pierre angulaire des entreprises prospères. Que ce soit pour transmettre des données critiques entre applications ou pour garantir des mises à jour en temps réel sur des systèmes distribués, une infrastructure de messagerie fiable est indispensable.

Azure Service Bus, un service de messagerie basé sur le cloud, apparaît comme une solution robuste permettant aux développeurs de créer des applications évolutives, découplées et résilientes. Explorons le domaine d'Azure Service Bus pour comprendre son importance et explorer ses multiples capacités. Plus tard dans cet article, nous examinerons également IronPDF pour gérer, générer et lire des documents PDF.

Comprendre Azure Service Bus

Azure Service Bus est un courtier de messages d'intégration d'entreprise entièrement géré qui facilite une communication fiable entre applications et services, qu'ils fonctionnent sur le cloud, sur site ou dans des environnements hybrides.

Il offre des capacités de messagerie flexibles, y compris des mécanismes de mise en file d'attente et de publication/souscription, pour permettre une communication fluide entre les composants disparates d'un système distribué. De plus, il permet les messages par lots, ce qui permet plusieurs messages sans dépasser la contrainte de taille totale.

Azure Service Bus offre les avantages suivants :

  1. Découplage des Applications : Le Service Bus vous permet de séparer les applications et les services les uns des autres. Ce découplage améliore la fiabilité et la scalabilité.
  2. Répartition de Charge : Il équilibre le travail entre les travailleurs en concurrence, assurant une utilisation efficace des ressources.
  3. Transfert de Message : Les données sont transférées entre applications et services à l'aide de messages. Le corps du message de ces messages peut contenir divers types de données, tels que JSON, XML ou texte brut.
  4. Scénarios de Messagerie : Les scénarios courants incluent le transfert de données commerciales (par exemple, les commandes de vente), la répartition de charge et l'activation des relations entre éditeurs et abonnés à l'aide de sujets et d'abonnements.
  5. Transactions : Le Service Bus prend en charge les transactions atomiques, permettant plusieurs opérations dans une seule portée de transaction. Une transaction comporterait plusieurs appels concurrents, alors qu'un lot de messages aurait un seul appel.
  6. Sessions de Message : Il facilite une coordination à grande échelle des flux de travail et des transferts de message ordonnés.

Caractéristiques Clés et Capacités

  1. Files d'Attente et Sujets : Azure Service Bus propose des files d'attente et des sujets comme canaux de communication. Les files d'attente permettent une communication point à point, garantissant que chaque message est traité par un seul récepteur, ce qui est idéal pour la répartition de la charge de travail et les scénarios de nivellement de charge. D'autre part, les sujets prennent en charge les modèles de messagerie publication/abonnement, permettant à plusieurs abonnés de recevoir indépendamment les messages pertinents, et facilitant les architectures événementielles évolutives.

  2. Livraison de Message Fiable : Avec Azure Service Bus, la livraison des messages est intrinsèquement fiable. Il garantit la persistance des messages, peut configurer le message et le gestionnaire d'erreur, la tolérance aux pannes et les sémantiques de livraison au moins une fois, minimisant le risque de perte ou de duplication de données. De plus, il prend en charge les transactions, permettant des opérations atomiques sur plusieurs messages, garantissant ainsi l'intégrité des données.

  3. Lettrage Mort et Politiques de Réessai : Pour gérer efficacement les messages erronés, Azure Service Bus fournit des capacités de lettrage mort, permettant aux messages problématiques d'être automatiquement déplacés vers une file d'attente séparée pour analyse et dépannage. De plus, il offre des politiques de réessai flexibles, permettant aux développeurs de configurer des réessais automatiques avec des stratégies de repli exponentielles, augmentant la résilience des applications face à des échecs transitoires.

  4. Partitionnement et Scalabilité : Azure Service Bus prend en charge le partitionnement des entités de messagerie pour distribuer la charge de travail sur plusieurs nœuds, garantissant une scalabilité horizontale et un débit élevé. Cette capacité est cruciale pour traiter de grands volumes de messages et s'adapter à des charges de travail fluctuantes sans compromettre les performances ou la fiabilité.

  5. Intégration au Réseau Azure : Azure Service Bus s'intègre parfaitement avec d'autres services Azure, comme Azure Functions, Logic Apps, Event Grid et Azure Kubernetes Service (AKS), permettant aux développeurs de créer des solutions bout en bout avec facilité. Que ce soit pour déclencher des fonctions sans serveur en réponse à des messages entrants ou orchestrer des flux de travail complexes à l'aide de Logic Apps, Azure Service Bus sert de clé de voûte pour construire des architectures événementielles robustes.

Introduction à IronPDF

Exemple Azure.Messaging.ServiceBus C# (Comment Cela Fonctionne) : Figure 1

IronPDF est une bibliothèque PDF C# puissante qui vous permet de générer, éditer et extraire du contenu de documents PDF dans des projets .NET. Voici quelques caractéristiques clés :

  1. Conversion HTML en PDF :

    • Convertissez du contenu HTML, CSS et JavaScript au format PDF.

    • Utilisez le moteur de rendu Chrome pour des PDF parfaits au pixel près.

    • Générez des PDF à partir d'URL, de fichiers HTML ou de chaînes HTML.
  2. Conversion d'Images et de Contenu :

    • Convertissez des images vers et depuis le format PDF.

    • Extrayez du texte et des images à partir de PDF existants.

    • Support pour divers formats d'image.
  3. Édition et Manipulation :

    • Définissez des propriétés, la sécurité et les permissions pour les PDF.

    • Ajoutez des signatures numériques.

    • Éditez les métadonnées et l'historique des révisions.
  4. Support Multiplateforme :

    • Fonctionne avec .NET Core (8, 7, 6, 5 et 3.1+), .NET Standard (2.0+) et .NET Framework (4.6.2+).

    • Compatible avec Windows, Linux et macOS.

    • Disponible sur NuGet pour une installation facile.

Générer un document PDF en utilisant IronPDF et Azure.Messaging.ServiceBus

Pour commencer, créez une application console en utilisant Visual Studio comme indiqué ci-dessous.

Exemple Azure.Messaging.ServiceBus C# (Comment Cela Fonctionne) : Figure 2

Fournir le nom du projet

Exemple Azure.Messaging.ServiceBus C# (Comment Cela Fonctionne) : Figure 3

Fournir la version .NET

Exemple Azure.Messaging.ServiceBus C# (Comment Cela Fonctionne) : Figure 4

Installez le package IronPDF.

Exemple Azure.Messaging.ServiceBus C# (Comment Cela Fonctionne) : Figure 5

Création d'Azure Service Bus

Créez un espace de noms avec un nom unique à travers Azure. Un espace de noms est un conteneur pour les ressources Service Bus telles que les files d'attente et les sujets au sein de votre application.

Voici comment créer un espace de noms :

  1. Connectez-vous au portail Azure.
  2. Allez à la page "Tous les services".
  3. Dans le volet de navigation de gauche, sélectionnez "Intégration" dans la liste des catégories.
  4. Survolez "Service Bus" et cliquez sur le bouton "+" sur la tuile Service Bus.

Exemple Azure.Messaging.ServiceBus C# (Comment Cela Fonctionne) : Figure 6

Pour configurer l'onglet Basics sur la page de création d'espace de noms, suivez ces étapes :

  1. Abonnement : Sélectionnez l'abonnement Azure où vous souhaitez créer l'espace de noms.
  2. Groupe de ressources : Choisissez un groupe de ressources existant où l'espace de noms sera situé, ou créez-en un nouveau.

  3. Nom de l'espace de noms : Entrez un nom pour l'espace de noms. Assurez-vous que le nom respecte les critères suivants :

    • Doit être unique dans Azure.

    • La longueur doit être comprise entre 6 et 50 caractères.

    • Ne peut contenir que des lettres, des chiffres et des traits d'union "-".

    • Doit commencer par une lettre et se terminer par une lettre ou un chiffre.

    • Ne peut pas se terminer par "-sb" ou "-mgmt".
  4. Emplacement : Sélectionnez la région où votre espace de noms doit être hébergé.
  5. Niveau de tarification : Choisissez le niveau de tarification (Basique, Standard ou Premium) pour l'espace de noms. Pour cet exemple, sélectionnez Standard.

  6. Sélectionnez Revoir + Créer en bas de la page.

Exemple Azure.Messaging.ServiceBus C# (Comment Cela Fonctionne) : Figure 7

  1. Sélectionnez Créer sur la page Revoir + Créer.

  2. Une fois le déploiement de la ressource réussi, Accédez à la ressource.

Vous voyez la page d'accueil de votre espace de noms Service Bus.

Créer des Files d'Attente Service Bus dans le Portail Azure

Pour configurer une file d'attente dans votre espace de noms Service Bus, suivez ces étapes :

  1. Naviguer vers les Files d'Attente : Allez à la page Espace de noms Service Bus dans le portail Azure. Sélectionnez "Files d'Attente" dans le menu de navigation gauche.
  2. Créer une Nouvelle File d'Attente : Sur la page des Files d'Attente, cliquez sur le bouton "+ File d'Attente" dans la barre d'outils.
  3. Configurer la File d'Attente : Entrez un nom pour votre file d'attente dans le champ fourni. Laissez les autres paramètres avec leurs valeurs par défaut. Les options que vous devez configurer lors de la création d'une file d'attente Azure Service Bus :

    1. Nom : Il s'agit de l'identifiant unique de votre file d'attente. Choisissez un nom descriptif et facile à retenir.

    2. Taille Maximum de la File d'Attente : Cela définit la capacité de stockage maximale de la file d'attente. Vous pouvez le définir sur 1 Go, 2 Go, 5 Go, 10 Go, 20 Go, 40 Go, 80 Go ou 100 Go. Pour votre cas, il est défini à 1 Go.

    3. Nombre Maximum de Livraisons : Cela spécifie le nombre maximal de livraisons d'un message avant qu'il ne soit envoyé à la file d'attente des messages en échec ou supprimé. Cela aide à gérer les échecs de traitement des messages.

    4. Durée de Vie des Messages (TTL) : Cela détermine combien de temps un message reste dans la file d'attente avant d'expirer. Vous pouvez définir cela en jours, heures, minutes et secondes. Une fois que le TTL est atteint, les messages en échec sont soit supprimés, soit déplacés vers la file d'attente des messages en échec si le lettrage mort est activé.

    5. Durée de Verrouillage : C'est la durée pendant laquelle un message est verrouillé pour traitement par un récepteur. Pendant ce temps, d'autres récepteurs ne peuvent pas traiter le même message. Vous pouvez définir cette durée en jours, heures, minutes et secondes.

    6. Activer le Lettrage Mort à l'Expiration des Messages : Lorsqu'il est activé, les messages qui expirent (c'est-à-dire dépassent leur TTL) sont déplacés vers la file d'attente des messages en échec au lieu d'être supprimés. Cela permet une inspection et un traitement supplémentaires des messages expirés.

    7. Activer le Partitionnement : Cette option active le partitionnement de la file d'attente sur plusieurs courtiers de messages, ce qui peut améliorer la scalabilité et le débit. Le partitionnement est utile pour gérer de grands volumes de messages.

Ces paramètres vous aident à contrôler le comportement et les performances de votre file d'attente Azure Service Bus, en vous assurant qu'elle réponde aux exigences de votre application.

Exemple Azure.Messaging.ServiceBus C# (Comment Cela Fonctionne) : Figure 8

  1. Finalisez la Création : Cliquez sur le bouton "Créer" pour finaliser la création de la file d'attente. Ces étapes vous assurent de créer avec succès une file d'attente dans votre espace de noms Service Bus en utilisant le portail Azure.

Installez Azure.Messaging.ServiceBus, une bibliothèque cliente Service Bus, pour se connecter à la file d'attente Azure en utilisant une chaîne de connexion.

Exemple Azure.Messaging.ServiceBus C# (Comment Cela Fonctionne) : Figure 9

Ajoutez le code ci-dessous pour envoyer des messages et recevoir des messages en utilisant Azure.Messaging.ServiceBus.

using Azure.Messaging.ServiceBus;
namespace CodeSample
{
    public static class AzureServiceBusDemo
    {
        public static async Task Execute()
        {
            string connectionString = "Endpoint=sb://iron-articles.servicebus.windows.net/;SharedAccessKeyName=all;SharedAccessKey=uqQIzpuc2HxbnAb9keqTINvzfTcFbkkU0+ASbJZ/tow=;EntityPath=ironpdf";
            string queName = "ironpdf";
            Console.WriteLine("Demo IronPDF with Azure.Messaging.ServiceBus");
            Installation.EnableWebSecurity = true;

            // Instantiate Renderer
            var renderer = new ChromePdfRenderer();
            var content = "<h1>Demo IronPDF with Azure.Messaging.ServiceBus</h1>";
            content += "<h2>Send Message to Azure.Messaging.ServiceBus Queue: ironpdf</h2>";

            await using var client = new ServiceBusClient(connectionString);
            var msgText = "IronPDF is Awesome Package";
            content += $"<p>Message: {msgText}</p>";

            var tx = client.CreateSender(queName);
            await tx.SendMessageAsync(new ServiceBusMessage(msgText)); // Send message to the queue
            Console.WriteLine($"Sent Below message at: {DateTime.Now}");
            content += $"<p>Sent Below message at: {DateTime.Now}</p>";

            Console.ReadLine(); // wait for user input to read the message;

            var rx = client.CreateReceiver(queName);
            var msg = await rx.ReceiveMessageAsync(); // receive messages
            content += "<h2>Receive Message from Azure.Messaging.ServiceBus Queue: ironpdf</h2>";
            content += $"<p>Recieved Below message at: {DateTime.Now}</p>";
            Console.WriteLine($"Recieved Below message at: {DateTime.Now}");

            content += $"<p>MessageID={msg.MessageId}</p>";
            Console.WriteLine($"MessageID={msg.MessageId}");

            content += $"<p>Message Received: {msg.Body}</p>";
            Console.WriteLine($"Message Received: {msg.Body}");

            var pdf = renderer.RenderHtmlAsPdf(content);
            // Export to a file or Stream
            pdf.SaveAs("AwesomeAzureServiceBusQueueAndIronPdf.pdf");
        }
    }
}
using Azure.Messaging.ServiceBus;
namespace CodeSample
{
    public static class AzureServiceBusDemo
    {
        public static async Task Execute()
        {
            string connectionString = "Endpoint=sb://iron-articles.servicebus.windows.net/;SharedAccessKeyName=all;SharedAccessKey=uqQIzpuc2HxbnAb9keqTINvzfTcFbkkU0+ASbJZ/tow=;EntityPath=ironpdf";
            string queName = "ironpdf";
            Console.WriteLine("Demo IronPDF with Azure.Messaging.ServiceBus");
            Installation.EnableWebSecurity = true;

            // Instantiate Renderer
            var renderer = new ChromePdfRenderer();
            var content = "<h1>Demo IronPDF with Azure.Messaging.ServiceBus</h1>";
            content += "<h2>Send Message to Azure.Messaging.ServiceBus Queue: ironpdf</h2>";

            await using var client = new ServiceBusClient(connectionString);
            var msgText = "IronPDF is Awesome Package";
            content += $"<p>Message: {msgText}</p>";

            var tx = client.CreateSender(queName);
            await tx.SendMessageAsync(new ServiceBusMessage(msgText)); // Send message to the queue
            Console.WriteLine($"Sent Below message at: {DateTime.Now}");
            content += $"<p>Sent Below message at: {DateTime.Now}</p>";

            Console.ReadLine(); // wait for user input to read the message;

            var rx = client.CreateReceiver(queName);
            var msg = await rx.ReceiveMessageAsync(); // receive messages
            content += "<h2>Receive Message from Azure.Messaging.ServiceBus Queue: ironpdf</h2>";
            content += $"<p>Recieved Below message at: {DateTime.Now}</p>";
            Console.WriteLine($"Recieved Below message at: {DateTime.Now}");

            content += $"<p>MessageID={msg.MessageId}</p>";
            Console.WriteLine($"MessageID={msg.MessageId}");

            content += $"<p>Message Received: {msg.Body}</p>";
            Console.WriteLine($"Message Received: {msg.Body}");

            var pdf = renderer.RenderHtmlAsPdf(content);
            // Export to a file or Stream
            pdf.SaveAs("AwesomeAzureServiceBusQueueAndIronPdf.pdf");
        }
    }
}
Imports Azure.Messaging.ServiceBus
Namespace CodeSample
	Public Module AzureServiceBusDemo
		Public Async Function Execute() As Task
			Dim connectionString As String = "Endpoint=sb://iron-articles.servicebus.windows.net/;SharedAccessKeyName=all;SharedAccessKey=uqQIzpuc2HxbnAb9keqTINvzfTcFbkkU0+ASbJZ/tow=;EntityPath=ironpdf"
			Dim queName As String = "ironpdf"
			Console.WriteLine("Demo IronPDF with Azure.Messaging.ServiceBus")
			Installation.EnableWebSecurity = True

			' Instantiate Renderer
			Dim renderer = New ChromePdfRenderer()
			Dim content = "<h1>Demo IronPDF with Azure.Messaging.ServiceBus</h1>"
			content &= "<h2>Send Message to Azure.Messaging.ServiceBus Queue: ironpdf</h2>"

			Await var client = New ServiceBusClient(connectionString)
			Dim msgText = "IronPDF is Awesome Package"
			content &= $"<p>Message: {msgText}</p>"

			Dim tx = client.CreateSender(queName)
			Await tx.SendMessageAsync(New ServiceBusMessage(msgText)) ' Send message to the queue
			Console.WriteLine($"Sent Below message at: {DateTime.Now}")
			content &= $"<p>Sent Below message at: {DateTime.Now}</p>"

			Console.ReadLine() ' wait for user input to read the message;

			Dim rx = client.CreateReceiver(queName)
			Dim msg = Await rx.ReceiveMessageAsync() ' receive messages
			content &= "<h2>Receive Message from Azure.Messaging.ServiceBus Queue: ironpdf</h2>"
			content &= $"<p>Recieved Below message at: {DateTime.Now}</p>"
			Console.WriteLine($"Recieved Below message at: {DateTime.Now}")

			content &= $"<p>MessageID={msg.MessageId}</p>"
			Console.WriteLine($"MessageID={msg.MessageId}")

			content &= $"<p>Message Received: {msg.Body}</p>"
			Console.WriteLine($"Message Received: {msg.Body}")

			Dim pdf = renderer.RenderHtmlAsPdf(content)
			' Export to a file or Stream
			pdf.SaveAs("AwesomeAzureServiceBusQueueAndIronPdf.pdf")
		End Function
	End Module
End Namespace
$vbLabelText   $csharpLabel

Explication du code

  1. Chaîne de Connexion et Nom de la File d'Attente :

    • La variable connectionString contient les détails de connexion pour votre espace de noms Azure Service Bus. Elle spécifie le point de terminaison, la clé d'accès partagée et le chemin de l'entité (nom de la file d'attente).

    • La variable queName contient le nom de la file d'attente Service Bus avec laquelle vous souhaitez travailler.
  2. Configuration de la Démo :

    • Le code commence par imprimer un message : “Démo IronPDF avec Azure.Messaging.ServiceBus.”

    • Il active la sécurité web en utilisant Installation.EnableWebSecurity = true;.
  3. Création d'un Client Service Bus :

    • Le ServiceBusClient est créé à l'aide de la chaîne de connexion fournie.

    • Ce client vous permet d'interagir avec les entités Service Bus (files d'attente, sujets, etc.).
  4. Envoi d'un Message :

    • Un message avec le contenu “IronPDF est un package génial” est envoyé à la file d'attente spécifiée en utilisant la méthode CreateSender.

    • Le message est créé en utilisant new ServiceBusMessage(msgText).

    • L'horodatage du message envoyé est imprimé à la console.
  5. Réception d'un Message :

    • Un récepteur est créé pour la même file d'attente en utilisant CreateReceiver.

    • Le code attend l'entrée utilisateur (en utilisant Console.ReadLine()) pour simuler le traitement des messages.

    • Lorsqu'un message est reçu, son ID et son corps sont imprimés à la console.
  6. Génération d'un PDF :

    • Le moteur de rendu crée un PDF à partir du contenu HTML (y compris les messages envoyés et reçus).

    • Le PDF résultant est enregistré sous le nom “AwesomeAzureServiceBusQueueAndIronPdf.pdf”.

Sortie

Exemple Azure.Messaging.ServiceBus C# (Comment Cela Fonctionne) : Figure 10

PDF

Exemple Azure.Messaging.ServiceBus C# (Comment Cela Fonctionne) : Figure 11

Licences IronPDF

Le package IronPDF nécessite une licence pour fonctionner et générer des PDF. Ajoutez le code ci-dessous au début de l'application avant d'accéder au package.

IronPdf.License.LicenseKey = "IRONPDF-MYLICENSE-KEY";
IronPdf.License.LicenseKey = "IRONPDF-MYLICENSE-KEY";
IRON VB CONVERTER ERROR developers@ironsoftware.com
$vbLabelText   $csharpLabel

Une licence d'essai est disponible sur la Page de Licence d'Essai IronPDF.

Conclusion

À une époque caractérisée par la transformation numérique et les avancées technologiques rapides, Azure Service Bus apparaît comme un composant central dans la modernisation des entreprises dans le monde entier. En offrant des capacités de messagerie fiables, évolutives et flexibles, il permet aux développeurs d'architecturer des solutions résilientes et agiles qui peuvent s'adapter aux exigences commerciales en évolution.

Que ce soit pour faciliter une intégration fluide, pour activer des architectures événementielles ou pour assurer une communication asynchrone, Azure Service Bus joue un rôle transformateur dans la stimulation de l'innovation et l'accélération des initiatives numériques dans tous les secteurs.

À mesure que les organisations continuent d'adopter les paradigmes natifs de cloud et les architectures distribuées, Azure Service Bus se tient comme un témoignage de l'engagement de Microsoft à habiliter les développeurs et les entreprises dans leur parcours vers le cloud. IronPDF simplifie la génération de PDF au sein des applications .NET, offrant flexibilité et fonctionnalité pour créer des documents de qualité professionnelle directement depuis du code.

Questions Fréquemment Posées

Comment puis-je convertir HTML en PDF en C# ?

Vous pouvez utiliser la méthode RenderHtmlAsPdf de IronPDF pour convertir des chaînes HTML en PDFs. De plus, vous pouvez utiliser la méthode RenderHtmlFileAsPdf pour convertir des fichiers HTML en PDFs.

Qu'est-ce qu'Azure Service Bus et comment améliore-t-il la communication ?

Azure Service Bus est un courtier de messages d'intégration d'entreprise entièrement géré qui améliore la communication en facilitant le transfert de messages fiable entre applications et services, qu'ils soient basés dans le cloud, sur site, ou dans des environnements hybrides.

Quelles sont les principales caractéristiques de la bibliothèque PDF utilisée dans l'article ?

La bibliothèque IronPDF offre des fonctionnalités telles que la conversion HTML en PDF, l'édition et la manipulation de PDFs, la conversion d'images, et une compatibilité multiplateforme avec divers frameworks .NET et systèmes d'exploitation.

Comment envoyez-vous des messages en utilisant Azure.Messaging.ServiceBus en C# ?

Pour envoyer des messages en utilisant Azure.Messaging.ServiceBus, vous créez un ServiceBusSender et utilisez la méthode SendMessageAsync pour envoyer des messages à la file d'attente.

Comment fonctionne le dead-lettering dans Azure Service Bus ?

Le dead-lettering dans Azure Service Bus déplace automatiquement les messages qui ne peuvent pas être traités vers une file d'attente de lettres mortes séparée, permettant aux développeurs d'analyser et de résoudre efficacement ces messages problématiques.

Azure Service Bus peut-il prendre en charge les architectures basées sur des événements ?

Oui, Azure Service Bus s'intègre parfaitement avec d'autres services Azure comme Azure Functions et Logic Apps, prenant en charge les architectures basées sur des événements et facilitant des solutions de messagerie évolutives et flexibles.

Quel est le processus pour recevoir des messages en utilisant Azure.Messaging.ServiceBus ?

Pour recevoir des messages en utilisant Azure.Messaging.ServiceBus, vous créez un ServiceBusReceiver et utilisez la méthode ReceiveMessageAsync pour traiter les messages entrants de la file d'attente.

Ai-je besoin d'une licence pour utiliser la bibliothèque PDF mentionnée dans l'article ?

Oui, IronPDF nécessite une licence pour générer des PDFs. Vous pouvez obtenir une clé de licence pour votre application ou utiliser une licence d'essai disponible sur la page de licence d'essai d'IronPDF.

Curtis Chau
Rédacteur technique

Curtis Chau détient un baccalauréat en informatique (Université de Carleton) et se spécialise dans le développement front-end avec expertise en Node.js, TypeScript, JavaScript et React. Passionné par la création d'interfaces utilisateur intuitives et esthétiquement plaisantes, Curtis aime travailler avec des frameworks modernes ...

Lire la suite