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
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
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
Event Tracing for Windows (ETW) et .NET Core
SQL Server avec Docker sur Windows
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?
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
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
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
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
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
Le scénario est le suivant :
Authentification LDAP et cookie partagé entre deux applications WebHost / SelfHost
ZMQ: Création d'un Service Bus IPC avec 0mq
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
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)
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)
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
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
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
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
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
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
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() ?
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
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
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)
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)
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
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
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
Objectif
Migrer un service web existant vers WebAPI (contrainte sur le format des réponses pour rester compatible avec les clients existants).
Concepts
ApiControllerMediaTypeFormatterIControllerConfiguration
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
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
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
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.