Devs

Développer des microservices .NET dans Kubernetes avec Docker Desktop

Docker Desktop inclut optionnellement un cluster Kubernetes local. Dans ce long article, je décris une mise en pratique de comment concrètement on peut tester une application composée de plusieurs services, et déboguer ceux-ci au besoin, dans le cluster Kubernetes local de Docker Desktop, avec des exemples réalistes, à savoir des dépendances d’infrastructure à SQL Server, à Azure Service Bus et à Azure Storage (Blob containers).

Je n’utilise pas l’intégration du projet C# à Docker via Visual Studio, qui génère un Dockerfile et a donc un impact sur le contenu de la solution. La méthode que je décris ici est complètement indépendante de comment on choisit de créer ses Dockerfiles et de leur emplacement dans ou hors de la solution. Je voulais une expérience en local qui soit la moins intrusive sur la solution dans Visual Studio (et sur ce qu’on persiste dans son dépôt Git).

Migration d'un site WordPress vers site statique

Ce blog a été migré plusieurs fois. A chaque fois, je mûri un peu ma démarche, sans que cela ne me prenne trop de temps personnel.

Azure Service Bus Emulator sur Kubernetes

Le 18 novembre dernier, Microsoft a publié son émulateur pour Azure Service Bus. Celui-ci complète notamment Azurite (l’émulateur pour Azure Storage), et permet enfin de développer une solution entièrement en local, malgré une dépendance à Azure Service Bus. Outre les aspects financiers, avoir un émulateur permet une meilleure résilience en télétravail: jusqu’à maintenant, une interruption de connexion internet rendait presqu’impossible le développement d’un projet dépendant du Service Bus.

Présentation officielle

La documentation officielle est ici:

AsyncLocal et ExecutionContext

Dans ce court article, je décris un problème que j’ai trouvé intéressant. Cela concerne ce qu’il me semble être un défaut de design de .NET avec AsyncLocal et ExecutionContext. On pourrait même simplifier en ne parlant que de AsyncLocal car je vois l’existence de ExecutionContext comme une conséquence pour supporter le premier.

Je pense que l’on va rencontrer ce « défaut » de plus en plus souvent sur un framework tel que ASP.NET Core à cause de deux choses:

Communication entre Windows 10 UWP et un module Bluetooth LE HM-1x

Cet article est susceptible de référencer des images manquantes ou de contenir des erreurs de formatage sur son contenu. Il s'agit d'un import provenant d'un ancien blog.

Beaucoup d’acronymes dans le titre: le but de cet article est d’illustrer comment simuler une communication type « terminal série » entre un Arduino et un PC avec Windows 10, via un module Bluetooth LE (Low Energy). La distance entre le PC et l’Arduino est d’une dizaine de mètres dans un appartement.

ASP.NET Core OpenIdConnect et liens dans des documents MS Office

Si vous utilisez le package standard Microsoft.AspNetCore.Authentication.OpenIdConnect pour gérer l’authentification d’une application web ASP.NET Core, vous devriez pouvoir observer un problème intéressant si vous tentez d’accéder à une page protégée (requérant un utilisateur authentifié) à partir d’un document ouvert dans un programme MS Office tel que Word.

Pour une introduction plus complète sur le package OpenIdConnect, indépendamment du problème que nous traitons ici, voici un excellent blog: An introduction to OpenID Connect in ASP.NET Core

Fake 5

Cet article est très ancien. Les choses ont bien changées depuis 2019. Le sujet abordé est conservé pour référence mais n'est certainement plus applicable en l'état.

Je pars du postulat que le lecteur connait Fake de nom, sait qu’il s’agit d’un DSL qui s’appuie sur le langage .NET F# et à quoi il sert, mais pas beaucoup plus. Il s’agit ici d’une introduction technique. L’objectif est de savoir lire un script Fake (et comprendre ce qu’il fait).

Event Tracing for Windows (ETW) et .NET Core

Cet article est très ancien. Les choses ont bien changées depuis 2019. Le sujet abordé est conservé pour référence mais n'est certainement plus applicable en l'état.

Event Tracing for Windows (ETW) et .NET Core

SQL Server avec Docker sur Windows

Cet article est très ancien. Les choses ont bien changées depuis 2017. Le sujet abordé est conservé pour référence mais n'est certainement plus applicable en l'état.

Cet article est une introduction à Docker sur Windows et présente comment mettre en oeuvre SQL Server dans un container docker à des fins de tests et développement.

Comment détecter la veille prolongée du système depuis un service Windows

Les événements de mise en veille prolongée (Sleep / Hibernate) peuvent s’avérer indispensables pour une application connectée, car les connexions vont être interrompues. Cet article présente deux approches: la première basée sur l’API standard SystemEvents, qui pose problème dans un service Windows; l’autre basée sur WMI qui fonctionnera dans tous les cas de figure (pour autant que je sache).

SystemEvents.PowerModeChanged

Le framework .NET fournit l’API SystemEvents à cet effet, avec l’événement PowerModeChanged.

Malheureusement, comme l’indique MSDN, cette API ne fonctionne pas en mode Service sans un petit « hack ».

Sécuriser des WebApi avec OAuth2 et Client Credentials?

Cet article est très ancien. Les choses ont bien changées depuis 2016. Le sujet abordé est conservé pour référence mais n'est certainement plus applicable en l'état.
Cet article est susceptible de référencer des images manquantes ou de contenir des erreurs de formatage sur son contenu. Il s'agit d'un import provenant d'un ancien blog.

J’ai déjà eu à implémenter des applications clientes compatibles OAuth (1 et 2), c’est-à-dire côté consommateur de ressources protégées, mais ce n’est que récemment que je me suis intéressé à la mise en place d’une solution de sécurité pour un ensemble d’applications. J’ai logiquement étudié ce qui se fait avec OAuth 2 et OpenID Connect (OIDC), et ce qui est couramment considéré comme l’état de l’art à l’heure actuelle.

Terminer proprement un programme console

Cet article est très ancien. Les choses ont bien changées depuis 2016. Le sujet abordé est conservé pour référence mais n'est certainement plus applicable en l'état.
Cet article est susceptible de référencer des images manquantes ou de contenir des erreurs de formatage sur son contenu. Il s'agit d'un import provenant d'un ancien blog.

Les programmes console ne sont pas morts: il est courant de permettre à un service Windows d’être lancé en mode console, et ASP.NET Core est initialement prévu pour être exécuté en mode console (en self host).

Calcul de hachage pendant la lecture d'un fichier

Le hachage (md5, sha1…) est très couramment utilisé en transmission de fichier, pour vérifier que les données n’ont pas été corrompues entre leur production et leur consommation. Si le poids du fichier est conséquent, il est préférable de calculer le hachage à la volée plutôt que de parcourir le fichier plusieurs fois (pour le hachage, puis pour consommer les données). Cela offre un gain de temps non négligeable sur un contenu de plusieurs gigaoctets. C’est aussi une contrainte lorsque le flux est en provenance du réseau: cela évite de devoir le stocker sur le disque avant de le traiter.

.NET en 2016

Cet article est très ancien. Les choses ont bien changées depuis 2016. Le sujet abordé est conservé pour référence mais n'est certainement plus applicable en l'état.

Comme premier article de 2016, j’ai décidé de décrire les évolutions qui ont lieu actuellement sur le framework .NET. Il ne s’agit pas d’un how-to, et je ne propose pas de nouvelles informations. Il y a beaucoup d’informations à recouper pour s’y retrouver dans la nouvelle trajectoire qu’a choisi Microsoft pour adapter son framework au marché pour les prochaines années. Cet article a pour but de proposer un tour d’horizon, de mon point de vue en tant que développeur, sur les récentes annonces faites autour de .NET.

Service Windows avec démarrage asynchrone

Cet article est très ancien. Les choses ont bien changées depuis 2015. Le sujet abordé est conservé pour référence mais n'est certainement plus applicable en l'état.

Le numéro de novembre dernier de MSDN Magazine contient un article de Mark Sowul intitulé Asynchronous Programming – Async from the Start. Il y est expliqué de façon très pédagogique comment démarrer une application WinForms ou WPF de manière asynchrone sans écueil. Cela m’a donné l’idée d’appliquer exactement le même sujet sur un service Windows (un hôte .NET).

DisposableOwnership<T>

Afin d’éviter une exclamation du type « tout ça pour ça ? », je tiens à avertir tout de suite que cet article ne présente rien de plus spectaculaire que cet objet :

struct DisposableOwnership<T> where T : IDisposable
{
    public readonly T Resource;
    public readonly bool IsOwned;

    public DisposableOwnership(T resource, bool isOwned)
    {
        Resource = resource;
        IsOwned = isOwned;
    }
}

Le principe est évident: gérer de façon adéquate la libération d’un IDisposable. Ce contrat est implémenté par tout objet qui détient des ressources à libérer en fin d’utilisation. Cependant dans beaucoup de cas, il n’est pas simple de savoir quand libérer un tel objet, en particulier lorsque c’est une ressource partagée entre différents objets.

Action Filter Attributes et IoC

Cet article est très ancien. Les choses ont bien changées depuis 2015. Le sujet abordé est conservé pour référence mais n'est certainement plus applicable en l'état.

Le titre de cet article pourrait aussi bien être « Attributs .NET et IoC » car le sujet de fond est l’injection de dépendances dans des attributs personnalisés. Je m’intéresse ici spécifiquement aux Action Filters MVC/WebApi dont le design oriente le développeur vers une voie qui n’est pas en parfaite cohérence, je le pense, avec l’objectif d’utilisation des attributs tel que décrits originellement sur MSDN, c’est-à-dire comme simples descripteurs, conteneurs de métadonnées, prévus pour être « scannés » (par réflexion).

Implémentation du pattern ZMQ Request/Reply avec un client ASP.NET

Cet article est très ancien. Les choses ont bien changées depuis 2015. Le sujet abordé est conservé pour référence mais n'est certainement plus applicable en l'état.
Cet article est susceptible de référencer des images manquantes ou de contenir des erreurs de formatage sur son contenu. Il s'agit d'un import provenant d'un ancien blog.

Le scénario est le suivant :

Authentification LDAP et cookie partagé entre deux applications WebHost / SelfHost

Cet article est très ancien. Les choses ont bien changées depuis 2015. Le sujet abordé est conservé pour référence mais n'est certainement plus applicable en l'état.
Cet article est susceptible de référencer des images manquantes ou de contenir des erreurs de formatage sur son contenu. Il s'agit d'un import provenant d'un ancien blog.

ZMQ: Création d'un Service Bus IPC avec 0mq

Cet article est très ancien. Les choses ont bien changées depuis 2015. Le sujet abordé est conservé pour référence mais n'est certainement plus applicable en l'état.
Cet article est susceptible de référencer des images manquantes ou de contenir des erreurs de formatage sur son contenu. Il s'agit d'un import provenant d'un ancien blog.

J’ai présenté la librairie de messaging ZMQ dans mon article une intro à 0mq que je vous recommande de lire avant celui-ci.

LMAX Disruptor pattern: une file non bloquante à ultra basse latence

Cet article est très ancien. Les choses ont bien changées depuis 2014. Le sujet abordé est conservé pour référence mais n'est certainement plus applicable en l'état.

LMAX Disruptor est un pattern et une implémentation conçue par la société LMAX pour des applications de trading haute fréquence (basse latence et haut débit). C’est un projet open-source Java pour lequel il existe une réécriture .NET.

ZeroMQ: une intro à 0MQ (.NET)

Cet article est très ancien. Les choses ont bien changées depuis 2014. Le sujet abordé est conservé pour référence mais n'est certainement plus applicable en l'état.
Cet article est susceptible de référencer des images manquantes ou de contenir des erreurs de formatage sur son contenu. Il s'agit d'un import provenant d'un ancien blog.

ZMQ est une API de files d’attentes (aka Messaging) basée sur des sockets et conçue spécialement pour des applications à hautes performances et faible latence.

Lire et modifier une propriété avec les Expression Trees (c#)

Voici l’objectif recherché :

Upload de fichier (cross-domain)

Cet article est très ancien. Les choses ont bien changées depuis 2014. Le sujet abordé est conservé pour référence mais n'est certainement plus applicable en l'état.
Cet article est susceptible de référencer des images manquantes ou de contenir des erreurs de formatage sur son contenu. Il s'agit d'un import provenant d'un ancien blog.

Ce sujet n’a rien de récent et plusieurs solutions existent depuis longtemps. Ces solutions varient selon notamment les conditions suivantes :

Chiffrement d'un ApiController

Cet article est très ancien. Les choses ont bien changées depuis 2014. Le sujet abordé est conservé pour référence mais n'est certainement plus applicable en l'état.

J’ai eu un cas intéressant cette semaine: « sécuriser » les échanges entre WebApi internes, dont une partie des services est exposée en externe. Certains ApiControllers publics, d’autres internes. Je me suis orienté vers une solution simple, sans doute peu générique, malgré tout très testable.
Cela consiste à chiffrer les échanges de ces contrôleurs internes (les paramètres et le résultat).

Self Host Web API 2

Cet article est très ancien. Les choses ont bien changées depuis 2014. Le sujet abordé est conservé pour référence mais n'est certainement plus applicable en l'état.

En cherchant des exemples d’application self host Web API avec OWIN (spécification implémentée par Katana), les seuls (mais nombreux) que j’ai trouvé mélangeaient tous les frameworks en une seule application, console typiquement.
Cet article présente l’exemple que j’aurai aimé trouver pour démarrer ma première application avec OWIN .

TinyProfiler

Cet article est très ancien. Les choses ont bien changées depuis 2014. Le sujet abordé est conservé pour référence mais n'est certainement plus applicable en l'état.

Vous est-il déjà arrivé d’évaluer le temps d’exécution d’un bout de code, à partir des logs ? Si oui et que vous trouvez cela laborieux, TinyProfiler est un exemple minimaliste (mais complet) pour mesurer le temps d’exécution par régions de code, en implémentant l’interface IDisposable.

Pattern Strategy

Cet article est susceptible de référencer des images manquantes ou de contenir des erreurs de formatage sur son contenu. Il s'agit d'un import provenant d'un ancien blog.

Je me rends compte que j’utilise ce pattern régulièrement depuis plus de six mois chez mon client actuel. C’est l’occasion d’en faire un retour car on en parle beaucoup moins que l’incontournable IoC. Contrairement à ce dernier, l’intérêt du pattern Strategy dépend beaucoup des projets.

Énumérations avec FlagsAttribute

Cet article est très ancien. Les choses ont bien changées depuis 2013. Le sujet abordé est conservé pour référence mais n'est certainement plus applicable en l'état.

FlagsAttribute appliqué à une énumération permet de combiner plusieurs valeurs de cette énumérations. Rien de nouveau pour vous (sinon, voir MSDN).

Mais de quelle façon définissez-vous les valeurs ?


[Flags]
public enum MyFlags
{
    Flag1 = 0x01,  // 00001
    Flag2 = 0x02,  // 00010
    Flag3 = 0x04,  // 00100
    Flag4 = 0x08,  // 01000
    Flag5 = 0x10   // 10000
}

Jusqu’à présent, j’avais l’habitude d’utiliser la notation ci-dessus, qui est équivalente à celle-ci:

Localisation

Cet article est très ancien. Les choses ont bien changées depuis 2013. Le sujet abordé est conservé pour référence mais n'est certainement plus applicable en l'état.
Cet article est susceptible de référencer des images manquantes ou de contenir des erreurs de formatage sur son contenu. Il s'agit d'un import provenant d'un ancien blog.

La localisation d’une application est un sujet à prendre en considération le plus tôt possible. La problématique principale est de permettre un mécanisme simple pour localiser toutes les ressources (chaînes, images, etc.). Cet article se limite à la localisation des chaînes. Il s’agit d’une approche paresseuse que j’ai pu expérimenter sur de véritables projets, et qui peut être utilisée en complément d’autres mécanismes, comme les classiques ressources localisées d’ASP.NET.

Pourquoi une tolérance aux fautes dans Application_Start() ?

Cet article est très ancien. Les choses ont bien changées depuis 2013. Le sujet abordé est conservé pour référence mais n'est certainement plus applicable en l'état.

Ce que laisse entendre le titre n’est pas tout à fait exact : la méthode Application_Start n’est pas tolérante aux fautes : une exception non capturée arrêtera son exécution. En revanche, l’application web est bien tolérante aux exceptions propagées par cette méthode.

ELMAH: Fallback ErrorLog

Cet article est très ancien. Les choses ont bien changées depuis 2013. Le sujet abordé est conservé pour référence mais n'est certainement plus applicable en l'état.
Cet article est susceptible de référencer des images manquantes ou de contenir des erreurs de formatage sur son contenu. Il s'agit d'un import provenant d'un ancien blog.

Ce court article présente une extension à ELMAH pour le support d’ErrorLogs composites.


Pour une introduction sur ELMAH, c’est par ici.

Umbraco: tri automatique

Cet article est très ancien. Les choses ont bien changées depuis 2013. Le sujet abordé est conservé pour référence mais n'est certainement plus applicable en l'état.

Dans le précédent article, j’explique comment injecter un pipeline de call handlers lors de la capture d’un événement dans le back-office d’Umbraco. Voici un exemple d’implémentation pour trier automatiquement des noeuds, par exemple suite à la publication d’un document ou à l’enregistrement d’un média.

Umbraco: Event handlers pipeline via interception (Unity et PIAB)

Cet article est très ancien. Les choses ont bien changées depuis 2013. Le sujet abordé est conservé pour référence mais n'est certainement plus applicable en l'état.

Précédemment, j’ai décrit une approche pour mettre en place un pipeline d’observateurs d’événements (observation des Event handlers d’Umbraco). Cet article présente comment étendre cette approche aux Action handlers d’Umbraco.

Umbraco: Event handlers pipeline via interception (Unity et PIAB)

Cet article est très ancien. Les choses ont bien changées depuis 2013. Le sujet abordé est conservé pour référence mais n'est certainement plus applicable en l'état.
Cet article est susceptible de référencer des images manquantes ou de contenir des erreurs de formatage sur son contenu. Il s'agit d'un import provenant d'un ancien blog.

Le framework d’Umbraco propose deux fonctionnalités pour la capture d’événements dans le back-office : les Event handlers et les Action handlers. Il est possible d’inscrire plusieurs observateurs mais il n’est pas possible de définir un ordre d’éxécution. De plus, il est difficile de créer des handlers sous forme de librairies réutilisables sur différents sites. Cet article propose un concept basé sur l’interception via Unity (et Entreprise Library 5) pour répondre à ces limitations.

Json.NET : Configurer ITraceWriter sur JsonMediaTypeFormatter

Cet article est très ancien. Les choses ont bien changées depuis 2013. Le sujet abordé est conservé pour référence mais n'est certainement plus applicable en l'état.

La dernière version de Json.NET (version 4.5.11 publiée sur Nuget en novembre 2012) permet de fournir une implémentation de ITraceWriter pour obtenir les traces générées lors des opérations de sérialisation.

Umbraco : Lire les propriétés de documents et de médias à partir de la base de données seule

Cet article est très ancien. Les choses ont bien changées depuis 2012. Le sujet abordé est conservé pour référence mais n'est certainement plus applicable en l'état.
Cet article est susceptible de référencer des images manquantes ou de contenir des erreurs de formatage sur son contenu. Il s'agit d'un import provenant d'un ancien blog.

Ce n’est pas forcément recommandé lorsqu’on utilise un CMS d’exploiter sa base hors de son contexte (web), mais c’est parfois nécessaire. Notamment si l’on veut effectuer des traitements différés, à partir d’un automate ou d’un service Windows par exemple.

ApiController: configuration distincte par contrôleur

Cet article est très ancien. Les choses ont bien changées depuis 2012. Le sujet abordé est conservé pour référence mais n'est certainement plus applicable en l'état.

Objectif

Migrer un service web existant vers WebAPI (contrainte sur le format des réponses pour rester compatible avec les clients existants).

Concepts


Ma première approche a été de ne pas compliquer le nouveau développement avec un filtre particulier, et de me limiter à retourner un seul format de réponse directement depuis le contrôleur de l’API. Cette solution est certainement faisable mais elle est en fait plus compliquée et ne va pas dans le sens suggéré par les WebAPI d’ASP.NET MVC.

XmlCommentDocumentationProvider et fichiers XML

Cet article est très ancien. Les choses ont bien changées depuis 2012. Le sujet abordé est conservé pour référence mais n'est certainement plus applicable en l'état.

C’est la preview de la prochaine mise à jour d’ASP.NET (ASP.NET Fall 2012) qui m’a convaincu de tester

Il s’agit en fait de l’intégration d’un package en version alpha sur nuget.

Delivery Status Notification (DSN) - parser en C#

Nous connaissons tous cet e-mail qui commence par…

Mail Delivery Error
 Note: This message was generated automagically. An error was detected, while processing the enclosed message.
[...]

Si l’on envoie des e-mails de façon automatique (automate, mailing list…), mon avis est qu’il est toujours important, parfois même indispensable, de traiter ces messages d’erreur: informer le destinateur, maintenir une liste de diffusion à jour en supprimant les adresses inexistantes, etc..

Json.NET: serialisation et deserialisation d'interfaces avec JsonConverter

Cet article est très ancien. Les choses ont bien changées depuis 2012. Le sujet abordé est conservé pour référence mais n'est certainement plus applicable en l'état.

Ce court billet illustre l’utilisation de la librairie Json.NET pour la sérialisation et la désérialisation d’interfaces. En fait, seule la désérialisation est intéressante puisque Json.NET est capable de sérialiser n’importe quel type d’instance.

Service Memcached pour Windows x64

Cet article est très ancien. Les choses ont bien changées depuis 2012. Le sujet abordé est conservé pour référence mais n'est certainement plus applicable en l'état.

J’ai mis un temps certain à trouver une version de Memcached compilée pour Windows 64 bits. Une fois trouvée, il fallait en faire un service entièrement paramétrable. Voici donc un service wrapper pour Memcached dans une version certes un peu ancienne (1.4.5), mais parfaitement fonctionnelle.