Installer un site web sur une Machines Virtuelles dans l'Azure

Je souhaite configurer mes sites web dans l'Azure.  il me faut installer des machines virtuelles leur attribuer des adresses IP fixes publique et leur attribuer un nom de sous domaine. En suite installer IIS sur les machines virtuelle et déployer les sites que je souhaite installer.

Tous les éléments

Seulement voilà, suite à une manipulation hasardeuse, j'ai supprimé un truc que je ne trouvais pas utile et je perds ma machine virtuelle SODEVLOG-002 en effet elle se retrouve sans adresse IP publique. Je vais rectifier tout ça.

Plus d'adresse IP publique

Dissocier de l'interface réseau

Ajouter une légende
Quand tout va bien on a ceci :

Machine Vistuelle avec adresse IP publique

Ce qui ne va pas c'est cela :

Plus de Machine virtuelle associée à mon adresse IP

Le souci, c'est que le bouton Associer vous laisse pantois :

Adresse IP Publique Associée à Aucun élément disponible

Mais ce n'est pas là qu'il faut associer, ce qu'il faut associer c'est la machine virtuelle 
à l'interface réseau :

Associer une adresse IP publique à une machine virtuelle dans l'Azure

En procédant comme suit :

Ajouter une légende

Voilà maintenant ma machine virtuelle à retrouver son adresse IP publique. Normalement si tout se passe bien vous n'avez pas à faire cette manipulation mais je la montre ici car elle peut être utile. Les suppressions intempestives sont très vites exécutée.

Accéder à un site Web derrière l'IIS d'une Machine Virtuelle

Une fois la machine parfaitement configurée avec sont adresse IP fixe et publique, il ne faut pas oublier dans l'Azure de réaliser les manipulations suivantes pour donner l'accès à aux ports https :

Configuration des ports HTTP et HTTPS d'une machine virtuelle dans l'Azure

Voilà, ce n'est pas parce que c'est dans l'Azure que c'est plus facile, certes l'interface de configuration, votre tableau de bord Azure vous aide en vous montrant les paramètres à configurer mais toutes les manipulations sont à réaliser comme sur une machine réelle.


C'est quoi Azure Key Vault ?

Parmi les choses à découvrir, on me parle de Key Vault dans l'Azure. Alors allons à l'essentiel et découvrons rapidement ce qu'est que le Coffre de clés Azure Key Vault.

Aure Key Vault

D'autant que lorsque l'on tombe sur les pages marketing de Microsoft, ce n'est pas forcément très clair : "Vous disposez d'un contrôle complet, sans effort, Key Vault ne nécessite ni logiciel de gestion de clés." Cette phrase est incertaine et n'apporte rien, ou pas grand chose, bref ce marketing est bien inutile.

Microsoft - A propos d'Azure Key Vault

On y parle de gestion des secrets, on se croirait dans une émission de télé ... Globalement, il s'agit de centraliser et de sauvegarder dans le Cloud Azure les "secrets des applications". Mais alors quels sont ces secrets que l'on peut cacher ?

Voici l'exemple d'une chaîne de connexion qui se trouve sauvegardée dans le fichier Web.config ou appsetting.json d'une application Web, il faut sécuriser cette partie de l'application d'autant plus que le couple user/password peut être "en clair" dans ces fichiers. Et bien là, vous pouvez stocker cette chaîne de connexion dans Key Vault.

Pour aller plus loin et avoir une idée rapide des détails techniques d'implémentation, voici la page suivante :

Microsoft - Authentification, requête et réponses
On y parle d'URL, d'API REST et des moyens de mettre en oeuvre la sécurité autour de Key Vault.

Vous pourrez utiliser Postman, cet outil qui permet de simuler une application qui fait des requêtes REST sur une API.

Donc pour finir, voici comment utiliser : l'Azure REST API Reference

Microsoft - Azure REST API Reference

Pour aller encore plus avant, je vais maintenant directement sur mon Portail Azure pour créer un Coffre de clés :

Mon Portail Azure - KeyVault
Mon Portail Azure - KeyVault

Je clique sur +Ajouter :

Gérer les Key Vault dans mon Portail Azure
Gérer les Key Vault dans mon Portail Azure

Voilà, ici j'ai des informations sur la Création d'un coffre de clés :

Azure - Créer un coffre de clés

Par la suite, je vais devoir choisir la Stratégie d'accès :


Azure Key Vault - Stratégie d'accès 

Puis le wizard me conduit vers la Mise à niveau :

Azure Key Vault - Stratégie d'accès

Enfin, je peux créer une première balise qui va me permettre de "sécuriser", de crypter une valeurs que je pourrais en suite utiliser dans mes applications en utilisant l'API REST d'Azure.

Azure Key Vault - Balises

Je ne peux pas aller plus loin sans m'engager dans l'utilisation et le paiement de ce service. Je vais donc ma'arrêter là mais je pense que comme moi vous avez compris comment et à quoi sert Azure KeyVault.

Mais voilà, nous venons de faire un tour rapide de ce qu'est Azure Key Vault, le coffre de clés pour sécuriser les informations critiques de vos applications.

Mise à jour en septembre 2020 
Je me pose la question de savoir si ce n'est pas exactement la même chose proposée gratuitement par GitHub ... Lorsque vous avez créé une "Organization" et que vous parcourez l'item "Secrets", comme ceci :

GitHub - Organization - Secrets

Vous avez la possibilité de créer des secrets... chut, un secret est un secret ! A creuser, mais il me semble bien que oui ;-)

Don't forget to go to the beach!

Memory leaks ou fuites mémoires, comment trouver l'origine d'une fuite mémoire ?

C'est important, pour tout développement logiciel, de mettre en place une bonne stratégie de logs et une bonne stratégie d’éradication des fuites mémoires. Sans quoi, le développement peut ne jamais aboutir car il y aura toujours des bugs ou des fuites mémoire que l'équipe de développement mettra un temps très important à corriger.

Aussi parmi les outils qui permettent d'aboutir dans le recherche de fuites mémoire sous Windows j'ai oublié WinDgb qui existe toujours.

WinDbg - Preview

Aussi, je ne savait pas que l'on pouvait utiliser WinDbg (Windows Debuggeur) pour chercher l'origine d'une fuite mémoire, je prends note ici de cet excellent article de Mathias Montantin :

Blog .NET -  Trouver l’origine d’une fuite mémoire avec WinDbg

WinDbg se trouve dans :

Microsoft - Hardware Dev Center - Dowload Debugging Tools for Windows



Croyez-moi, C'est toujours bon à savoir ;-)

EntityFramework Core (EF Core) dans .NET - La meilleure documentation !

Tout le monde y va de son petit sample, de son exemple d'utilisation d'Entity Framework Core. Moi même j'ai pu décrire de temps en temps quelques commandes EF Core et puis je trouve la page ultime, celle qui remplace toutes les autres pages le site de la meilleure documentation sur Entity Framework Core.

La documentation qui est à la fois un tutorial intéressant à suivre même pour les plus expérimentés. Une documentation qui décrit l'intégralité de toutes les fonctions avec des exemples simples et bien construits à croire que cela ne peut pas être quelqu'un de Redmond car ils ne nous ont pas habitué à une telle documentation sur un produit.

Je pense que c'est l'effet OpenSource et ma fois, je suis bien content d'avoir trouvé ce site auquel je me réfère chaque fois que j'ai besoin d'approfondir mes connaissances de l'Entity Framework Core :

https://www.entityframeworktutorial.net/efcore/entity-framework-core.aspx
La meilleure documentation sur Entity Framework Core the Ultimate Documentation

C'est un exemple de documentation à suivre, il est fabuleux !

Have fun!

Authentification des Applications ASP.NET Core avec IdentityServer4 et Identity

Après un article complet sur le sujet de l'authentification des applications web. Je souhaite élargir mes connaissances à la découverte et à l'utilisation d'IdentityServer4.

Petite note personnelle, je suis très surpris de trouver ça :

\AngularAspNetCoreAuthen\Areas\Identity\Pages\Account\Register.cshtml.cs
namespace AngularAspNetAuthen.Areas.Identity.Pages.Account
{
    [AllowAnonymous]
    public class RegisterModel : PageModel
    {
        private readonly SignInManager<ApplicationUser> _signInManager;

\AspNetCoreMvcAuthen\Areas\Identity\Pages\Account\Register.cshtml.cs
namespace AspNetCoreMvcAuthen.Areas.Identity.Pages.Account
{
    [AllowAnonymous]
    public class RegisterModel : PageModel
    {
        private readonly SignInManager<IdentityUser> _signInManager;


C'est curieux on dirait que le model d'application ASP.NET Core Angular est plus évolué que celui d'MVC ... à méditer.

Bon maintenant que je sais faire du Scaffolding sur L'Identity voici après étude des différentes solutions le modèle de base que je vais utiliser :

https://github.com/damienbod/IdentityServer4AspNetCoreIdentityTemplate


https://github.com/damienbod/IdentityServer4AspNetCoreIdentityTemplate
IdentityServer4AspNetCoreIdentityTemplate

An ASP.NET Core IdentityServer4 Identity Template with Bootstrap 4 and Localization

CQFD

Comment faire des Logs dans ASP.NET Core C#

Cela fait cent fois que l'on parle de log nous avons résolut le problème avec Log4Net pendant deux bonnes décennies mais c'est comme tout, les choses changent. Alors aujourd'hui ce qui est le mieux intégré à ASP.NET Core c'est Serilog.

Qu'à cela ne tienne, allons y rapidement, pour faire des Logs dans mon Projet ASP.NET Core avec Serilog le plus simplement du monde.

Il faut installer les packages suivants :
NuGet Packages  pour Serilog
C'est bon de la noter car maintenant chaque fois que j'instancie un nouveau projet, je me vois obligé de copier ces quelques lignes dans mon nouveau projet tellement c'est simple et efficace.

Dans mon fichier Startup.cs
J'écris le code de la fonction suivante :

private void ConfigureLoggerFactory( ILoggerFactory loggerFactory )
{
    string date = DateTime.Now.ToString();
    date = date.Replace( "/", "" );
    date = date.Replace( " ", "_" );
    date = date.Replace( ":", "-" );
    string logfileName = $"Log/log_{date}.txt";

    var serilog = new LoggerConfiguration()
        .MinimumLevel.Verbose()
        .Enrich.FromLogContext()
        .WriteTo.File( logfileName );


    loggerFactory.WithFilter( new FilterLoggerSettings
     {
         { "IdentityServer4", LogLevel.Debug },
         { "Microsoft", LogLevel.Warning },
         { "System", LogLevel.Warning },
     } ).AddSerilog( serilog.CreateLogger() );
}


Que j'appelle dans la fonction Configure de la façon suivante :

public void Configure( IApplicationBuilder app, IWebHostEnvironment env, ILoggerFactory loggerFactory )

ConfigureLoggerFactory( loggerFactory );

Voilà, l'intérêt de faire ainsi c'est que l'on récupère des logs en provenance des modules System, Microsoft, et IdentityServer4.

N'oubliez pas de consulter :

C#.NET - Serilog Log Not Working

Pour savoir comment configurer les Logs

CQFD

Comment ajouter des données personnelles aux Base d'authentification ASP.NET Core ?

De base il y a le nom, l'adresse email, la structure d'une application ASP.NET Core concernant l'authentification est déjà assez complète mais je souhaite y ajouter des données personnelles sur l'utilisateur âge ou date de naissance, adresse, localisation qu'il va pouvoir gérer dans son profile au sein de mon Application Web ASP.NET Core.



https://identityserver.io/
Authentification dans les application ASP.NET Core & Angular
Je crois que quasiment tout le travaille est déjà fait ...

Microsoft - Ajouter, télécharger et supprimer des données utilisateur personnalisées pour l’identité dans un projet ASP.NET Core

En continuant mes recherches, je trouve ce projet et cet auteur qui me semble bien avancé :

Mark Macneil - User Authentication and Identity with Angular, Asp.Net Core and IdentityServer
Ce qui est un petit peu ennuyeux pour ne pas dire plus, c'est la disparité de tous ces projets. Je clone

https://github.com/mmacneil/AngularASPNETCoreOAuth

et je m'intéresse précisément au projet suivant :

https://github.com/mmacneil/AngularASPNETCoreOAuth/tree/master/src/AuthServer

Car je souhaite également déployer une application d'Authentification pour authentifier des utilisateurs dans mes applications Angular.

Je lance la solution dans mon Visual Studio, jusque là tout vas bien, mais quand je souhaite créer la base de données, je vais dans la console Package Management Console :

PM> update-database

Et là ce sont des insultes jusqu' à ce que je comprenne que le package :

Microsoft.EntityFrameworkCore.Tools

N'est pas installé et pourtant cette commande en dépend, allons y installons ce package pour ce projet:

PM> Install-Package Microsoft.EntityFrameworkCore.Tools

Mais là pareil, un flot d'injures le tout en rouge dans ma PMC, jusqu'à ce que je mette à jour la version des packages ...


Mise à jour des packages autour d'EntityFrameworkCore  pour installer EntityFrameworkCore.Tools
Mise à jour des packages autour d'EntityFrameworkCore  pour installer EntityFrameworkCore.Tools
Cette fois, je vais enfin pouvoir exécuter la fameuse commande :

PM> update-database

Et bien non rien à faire ...


Update-database
Your startup project 'AuthServer' doesn't reference Microsoft.EntityFrameworkCore.Design. This package is required for the Entity Framework Core Tools to work. Ensure your startup project is correct, install the package, and try again.

Cette fois j'en ai ras le bol, je pars, je reviendrai demain ...

Le lendemain ... Reprenons calmement ...

J'installe le package Microsoft.EntityFrameworkCore.Design pour le projet principal AuthServer


Install package Microsoft.EntityFrameworkCore.Design
Je me positionne dans le répertoire de l'Infra :

PM> cd .\AuthServer.Infrastructure
PM> update-database
Build started...
Build succeeded.
More than one DbContext was found. Specify which one to use. Use the '-Context' parameter for PowerShell commands and the '--context' parameter for dotnet commands.
PM>

Là, on retourne chez l'auteur qui nous dit :

AuthServer.Infrastructure> dotnet ef database update --context AppIdentityDbContext
AuthServer.Infrastructure> dotnet ef database update --context PersistedGrantDbContext

et que l'on va traduire par la commande suivante dans la Console Package Management :

PM> update-database -context AppIdentityDbContext
Build started...
Build succeeded.
DesignTimeDbContextFactory.Create(string): Connection string: Server=(localdb)\mssqllocaldb;Database=AuthServer;Trusted_Connection=True;MultipleActiveResultSets=true
Applying migration '20190403041320_initial'.
Done.
PM>

La documentation est Ici :

Microsoft EF Core - Migrations

Aaaahhhh c'est la lutte quand même, encore un machin très microsoftien c'est la multiplication des fenêtres d'exécution (des consoles) entre PowerShell Package Management Console ou même Windows Console avec dotnet ...

Ma Base de donnée d'Authentification des Utilisateurs est enfin crée :


ASP.NET Core DB - Base d'Authentification des utilisateurs
Il ne faut pas oublier d'exécuter la deuxième commande :

PM> update-database -context PersistedGrantDbContext

Et pour le message :

Method not found: 'Microsoft.EntityFrameworkCore.Metadata.Builders.IndexBuilder Microsoft.EntityFrameworkCore.Metadata.Builders.EntityTypeBuilder`1.HasIndex(System.Linq.Expressions.Expression`1<System.Func`2<!0,System.Object>>)'.

La solution préconisée est  Ici.

C'est de bien mettre à jour tous vos projets en vous assurant qu'ils utilisent la même version de IdentityServer ... Sinon, Beug !

PM> update-database -context PersistedGrantDbContext
Build started...
Build succeeded.
Microsoft.EntityFrameworkCore.Infrastructure[10403]
      Entity Framework Core 3.1.2 initialized 'PersistedGrantDbContext' using provider 'Microsoft.EntityFrameworkCore.SqlServer' with options: None
Microsoft.EntityFrameworkCore.Database.Command[20101]
      Executed DbCommand (26ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
      SELECT 1
Microsoft.EntityFrameworkCore.Database.Command[20101]
      Executed DbCommand (22ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
      SELECT OBJECT_ID(N'[__EFMigrationsHistory]');
Microsoft.EntityFrameworkCore.Database.Command[20101]
      Executed DbCommand (1ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
      SELECT 1
Microsoft.EntityFrameworkCore.Database.Command[20101]
      Executed DbCommand (0ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
      SELECT OBJECT_ID(N'[__EFMigrationsHistory]');
Microsoft.EntityFrameworkCore.Database.Command[20101]
      Executed DbCommand (2ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
      SELECT [MigrationId], [ProductVersion]
      FROM [__EFMigrationsHistory]
      ORDER BY [MigrationId];
Microsoft.EntityFrameworkCore.Migrations[20405]
      No migrations were applied. The database is already up to date.
No migrations were applied. The database is already up to date.
Done.

PM>

Voilà pour la partie, Serveur d'Authentification.

Authentification - Partie cliente avec Angular

Cette fois, je prends mon Visual Studio Code et je viens ouvrir le répertoire :

\Visual Studio 2019\Samples\AngularASPNETCoreOAuth\src\Spa\oauth-client

Et je viens exécuter la commande dans un Terminal :


Client Angular - Visual Studio Core pour l'install de Angular/CLI
Je dois installer Angular CLI pour mon application cliente :

PS : \AngularASPNETCoreOAuth\src\Spa\oauth-client> ng install @angular/cli

Pour rappel l'installation d'Angular CLI se distingue par l'existence du répertoire :

\AngularASPNETCoreOAuth\src\Spa\oauth-client\node_modules\@angular

Une fois Angular/CLI installé, je peux lancer la compilation de mon application Angular :

PS : \AngularASPNETCoreOAuth\src\Spa\oauth-client> ng serve

Exécution en mode Debug de la partie Angular

Il me faut créer un fichier de configuration de l'exécution du mode Debug :



Angular Run en mode Debug
Angular Run en mode Debug

N'oubliez pas de modifier le port de communication proposé par défaut pour une application web : 8080 par le port 4200 pour les applications Web Angular.


Angular Run en mode Debug
Vous pouvez enfin cliquer sur le petit triangle vert et obtenir le résultat suivant en exécutant la partie cliente SPA (Single Page Application) :


Angular Authentification sur un Serveur ASP.NET Core avec IdentityServer
Angular Authentification sur un Serveur ASP.NET Core avec IdentityServer

Je me "Signup" avec un UserName : "aaa", je me Login et j'obtiens l'accès  à la "Top Secret Area" :


Angular Authentification sur un Serveur ASP.NET Core avec IdentityServer - Top Secret Area
Voilà, il est vraiment super cet exemple et très complet et mériterait un bisou sauf que nous sommes en période de Corona.

Thank you very much Mark Macneil

Mais vous l'avez vu pour aller au bout de cette application ,il y a plein de pièges que j'ai déjoués pour nous alors n'hésitez pas à cliquer partout, à commenter, à compléter.

La prochaine fois nous verrons comment ajouter des données autour de "MemberIdentity" car moi j'aimerais bien savoir où il habite mon utilisateur ;-)

Let's go to the beach!

Ah non, mince, c'est Corona, Grrrrr.

Je vous propose de poursuivre cette exploration des Bases de Données d'Authentification dans ASP.NET C# car cela concerne plus les applications Web.

ASP.NET Core comparaison des structures des Bases de données IdentityServer



StackOverflow - SeriLog LogDebug not working

Je lis ce message sur le site Stack Overflow : J'ai une application Web ASP.Net5 avec serilog configuré. Dans mon contrôleur personnel, j'imprime un message d'avertissement, d'erreur, de détail et de débogage, mais sur ma console, seuls les messages d'avertissement, d'erreur et de détail s'affichent.

Alors, comme je ne peux pas répondre là bas, je vais répondre ici ... car le réponse qui est donnée sur le site de StackOverFlow n'est pas la bonne !

ASPNet5 SeriLog LogDebug not working

I have the same issue, Debug Level is after the Verbose Level so it should work.
If Instead of using your own Logger, you direct use the Serilog one :
Serilog.Log.Verbose( "1. Log Verbose" );
Serilog.Log.Log.Debug( "2. Log Debug" );
It works ! You will see the messages.

My answer :

I think the problem come's more from Serilog Logging system that does not overring  Microsoft.Extensions.Logging.LogDebug
and LogTrace it's the same thing.

Mais au moment de publier ma réponse le site me répond tout bonnement "vous n'avez plus accès à la partie réponses avec ce compte d'utilisateur" !

Solution à LogDebug not working

Il s'agit de gérer le niveau de Trace. Voici ce qu'il faut faire dans le fichier de configuration : Application\appsettings.Development.json

  "Logging": {
    "LogLevel": {
      "Default": "Trace",
      "System": "Information",
      "Microsoft": "Information"
    },
    "Console": {
      "IncludeScopes": true
    }
  },

  "Serilog": {
    "Using": [ "Serilog.Sinks.RollingFile" ],
    "MinimumLevel": {
      "Default": "Verbose",
      "Override": {
        "System": "Warning",
        "Microsoft": "Warning"
      }
    }
  },


Et dans mon fichier : Application\appsettings.json

  "Logging": {
    "LogLevel": {
      "Default": "Warning"
    }
  },

  "Serilog": {
    "Using": [ "Serilog.Sinks.RollingFile" ],
    "MinimumLevel": {
      "Default": "Warning",
      "Override": {
        "Microsoft.EntityFrameworkCore.Database.Command": "Error",
        "System": "Error",
        "Microsoft": "Warning",
      }
    },


Voilà et maintenant ça fonctionne "je vois" mes LogDebug.

PS : Si je ne vais pas directement dans StackOverflow écrire cette réponse c'est parce que leur système est un peu pourri et je n'accède plus aux réponses car j'ai donné une réponse par le passé qui n'a pas été notée ! Grrrr.

Error CS0656 Missing compiler required member 'Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo.Create'

Blurps, blurps, j'ai un peu de mal à digérer cette erreur, on s'accroche et on trouve la solution ... voici le contexte : une application ASP.NET Core C# mais je penses qu'il suffit d'utiliser le mot clef "dynamic" pour avoir des soucis et obtenir cette erreur.

Il y a une partie de réponse succincte ici :

Add the reference to Microsoft.CSharp as
Project->add reference-->Framework-->Microsoft.CSharp

Visual Studio - How to fix missing compiler member error Microsoft.CSharp.RuntimeBinder.CSharpArgumentInfo.Create

Mais cette réponse est trop rapide, en effet on ne trouve rien dans l'onglet correspondant, il faut aller chercher la référence à cette DLL directement dans le Framwork "à la main" de la façon suivante :

C:\Windows\Microsoft.NET\Framework64\v4.0.30319
C:\Windows\Microsoft.NET\Framework64\v4.0.30319
Et toujours cette fonction de recherche de fichiers sous Windows 10 qui n'est vraiment pas satisfaisante mais bon, passons. On fini par trouver le path de la DLL, dont on va pouvoir ajouter la référence dans le projet.

C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Microsoft.CSharp.dll

Mais n'est-ce pas un peu aberrant cette façon de faire, en tous cas elle est dépendante de la machine, alors il y en a un qui préconise l'installation de NuGet :

They have in common that one may add NuGet package Microsoft.CSharp:
"... install the Microsoft.CSharp package in the .NET Standard project. This library is necessary to use the C# dynamic data type in a .NET Standard library. ..."


Personnellement, j'ai installé le NuGet package Microsoft.CSharp :


.NET Core Utilisation de Dynamic -> Installation du package Microsoft.CSharp
.NET Core Utilisation de Dynamic -> Installation du package Microsoft.CSharp

Et cela à fonctionné pour moi, mais elle est un peu ... heu, comment dire, violente cette erreur simplement sur l'utilisation du mot clef dynamic. J'espère que cela sera corrigé dans les prochaines release de Visual Studio.

CQFD !

Où en est-on du Design Pattern MVVM en WPF ?

Pour réaliser une application WPF sur le modèle MVVM que dois-je faire aujourd'hui en 2019 ? J'en suis resté à quelque chose de pas très fini à mon sens. Chacun a son petit MVVM Design Pattern d'implémenté à sa sauce, je cite pelle mêle, Laurent Bugnion,  Josh Smith (who thanks John Gossman), Prism, Wilfried Woiré et j'ai contribué également à l'époque avec le WPF Prims Toolkit.

http://prismlibrary.github.io
Cette image vient de PRISM
Alors, je reprends les reines et j'espère bien qu'aujourd'hui, si j'instancie une nouvelle Application Desktop WPF avec mon Visual Studio 2017 Community le framework design pattern MVVM est déjà dans mon Template d'application WPF. Non ?

Malheureusement, je replonge dans les affres d'MVVM avec des sites actuels qui m'expliquent ce qu'est le modèle M-V-VM :

C# Corner - MVVM in WPF
Il est gonflé le gars, il te présente le Design Pattern MVVM comme si c'était un truc nouveau le "last update" de son article date de Fev 2018 ! Alors qu'en bas (toujours pareil pour connaitre la vraie date d'un article allez voir les commentaires) les commentaires dates de 2013. On est où ? En 2018 ou en 2013, largué en tous cas ! Bon j'avoue les explications ne sont pas mauvaises, si vous ne connaissez pas MVVM ça peut être bon à prendre.

Pour le reste, je dois retourné avec Laurent Bugion et la chose principale qui a changée depuis lors c'est la disparition du CodePlex snif ! Laurent Bugnion a migré son projet dans GitHub :

GitHub - Laurent Bugnion - mvvmlight
C'est bien parce qu'il existe encore et malgré tout, cela permet de voir que la communauté est vivante. Mais son framwork est orienté portabilité Xamarin.Android, Xamarin.iOS, Xamarin.Forms, WPF. C'est curieux il cite encore Silverlight (O:))

Et à part ça ?

SupInfo - WPF - MVVM : Le Data Binding
Ils sont mignons, aucun code, tout à la mimine, depuis zéro, en Oct. 2015 ! Et bien ils ne sont pas en avance.

Et donc, en continuant mes recherches, je retrouve également Prism et son nouveau site ... avec peut-être en roadmap la version 6.0.


http://prismlibrary.github.io/docs/wpf/legacy/Implementing-MVVM.html
Prism Library - Implementing the MVVM Pattern Using the Prism Library for WPF
Voilà, alors faut-il aller plus loin ? Je pense qu'il me faut commencer par installer un Template. C'est tout en bas de la page :


https://marketplace.visualstudio.com/items?itemName=BrianLagunas.PrismTemplatePack
Prism Template Pack
Ce n'est pas un NuGet mais une extension Visual Studio :

Visual Studio -> Outils -> Extensions et mises à jour ...

Je n'ai pas trouvé si facilement, j'ai du aller dans -> En ligne -> Visual Studio Marketplace -> Modèles -> Visual C# -> WPF et dans la barre de recherche je tape "Prism" :

Extension Visual Studio - Prism
Voilà, je vais tester tout ça te revenir vous dire si on peut faire une Application Desktop WPF efficace avec tout ça.

Il y a un nom a retenir c'est Brian Lagunas qui est le "product owner" de Prism 6.0 qui sortira surement bientôt ;) et qui est totalement "Open Source".

Pour faire fonctionner quelques exemples comme :

GitHub - Brian Lagunas - InfragisticsWebinarSimpleMVVMPrism

L'installation du Prism Template Pack n'a pas suffit. J'ai du exécuter la commande suivante dans la Console du Gestionnaire de package :

PM> Install-Package System.Windows.Interactivity.WPF -Version 2.0.20525

Pour la suite je me permets de noter un autre lien :

GitHub - PrismLibrary / Prism

Have fun!

Les objets en C#

En C++, on connait des objets comme "array", "list", "tuple", "vector" mais alors quels sont ces objets en C# ? Quels sont les objets de la librairie standard du C# ? C'est la question que j'ai envie de me poser aujourd'hui.

Les Objets en langage C#
Les Objets en langage C#
Il y a un peu de confusion entre "programmation objet" et "les objets en C#". En langage C# on trouve notamment à la rubrique objets :

MSDN - Objets (Guide de programmation C#)
Comparaison entre Class et Struct, les Class sont des types référence et les Struct sont des types valeur.

Programmation orientée objet, pour mémoire :
L’encapsulation signifie qu’un groupe de propriétés, méthodes et autres membres corrélés est traité comme une unité ou un objet unique.
L’héritage décrit la possibilité de créer des classes à partir d’une classe existante.
Le polymorphisme signifie que plusieurs classes peuvent être utilisées de manière interchangeable, même si chacune des classes implémente les mêmes propriétés ou méthodes de manière différente.

MSDN - Programmation orientée objet (C#)
Rappel des concepts de programmation objet :

Interface, delegate, champ et propriétés, sealed, abstract

Modificateurs d’accès et niveaux d’accès
public  Tout autre code du même assembly ou d'un autre assembly qui y fait référence peut accéder au type ou au membre.
private  Seul le code de la même classe peut accéder au type ou au membre.
protected Seul le code de la même classe ou d'une classe dérivée peut accéder au type ou au membre.
internal Tout code du même assembly, mais pas d'un autre assembly, peut accéder au type ou au membre.
protected internal Tout code du même assembly ou toute classe dérivée dans un autre assembly peut accéder au type ou au membre.
private protected  Le code de la même classe ou d'une classe dérivée peut accéder au type ou au membre dans l’assembly de la classe de base.

Substitution de membres
virtual Autorise la substitution d'un membre de classe dans une classe dérivée.
override Substitue un membre virtuel (substituable) défini dans la classe de base.
abstract Requiert qu'un membre de classe soit substitué dans la classe dérivée.
new, modificateur Masque un membre hérité d'une classe de base.

OPENCLASSROOMS - Programmez en orienté objet avec C#
Cours rapides et efficaces sur la programmation objet (POO)

Et maintenant avec tout ça nous n'avons pas encore vu d'objet C# à proprement parlé.

Les Objets en C#

On trouve le Tuple
Mais c'est plutôt un "concept C#" qu'un objet et c'est d'ailleurs un objet assez complexe , il me fait penser à l'objet "élastique".

Du coup je me retrouve à réviser un petit peu mon C# Objet et je trouve la page suivante :

MSDN - Object.Equals Method
Complexe déjà non ? Pour des Structs la fonction Equals comparera les valeurs, on dit que struct est un type par valeur tandis que pour des Class Equals comparera les références. Autrement dit pour comparer des Class il veut mieux dériver de l'interface IComparable et implémenter la fonction overridée CompareTo.

On fait de la POO mais toujours pas d'objets. Si je cherche "Librairies en C#.NET" je tombe sur des livres ???!

To Be Continued

C'est quoi Azure Container Services ?

Je poursuis dans l'Azure, j'ai essayé sans succès d'installer directement Docker dans un machine Windows. Comment puis-je utiliser la puissance des Containers (Conteneurs). Autrement dit, puis-je utiliser des images containers autrement qu'en installant Docker sur ma machine hôte Windows ?

Docker Hub
Question corolaire, comment utiliser les images containers le plus simplement possible ?

Microsoft Container Registry
Dans l'Aure, je cherche les services concernant les Containers :


Microsoft Azure - Containers Services
Il me semble que Kubernetes est un service de gestion des conteneurs donc l'idée serait de commencer par la création d'un Conteneur.

Allez c'est parti.

Azure création d'un Conteneur

Dans le formulaire Instances de conteneurs, je vois le bouton Ajouter :


Azure Container Ajouter
Un wizard, 3 étapes, on commence par "De base" et le nom du Container.

Azure Container Image
Alors c'est quoi une "Azure Container Image" ? Une partie de la réponse à cette question se trouve Ici :

ROHIT TATACHAR - Improved discovery experience for Microsoft containers on Docker Hub
Je nous le met en français :
À partir de mai 2018, une petite sélection d'images a été migrée de microsoft / * vers mcr.microsoft.com/*. La plupart des images ont maintenant été transférées vers mcr.microsoft.com tout en maintenant l'expérience de découverte sur Docker Hub.

La transition est toujours en cours et nous espérons que 100% des pensions livrées seront transférées à MCR dans les prochains mois. De plus, nous déplaçons les images officielles Microsoft de la liste «communauté» vers la catégorie «Éditeur vérifié» sur Docker Hub.

Avec cette mise à jour, il est possible de rechercher des images Microsoft en cochant la case "Editeur vérifié" dans la nouvelle expérience utilisateur de Docker Hub. Les images elles-mêmes n'ont pas changé avec cette transition - il n'y a pas de changement dans l'expérience de tirage de l'image, mais uniquement dans l'expérience de découverte.

Si je comprends, les images Microsoft quittent DockerHub ... pour aller vers mcr.

Donc si on veut récupérer une Image pour notre Azure Container on peut aller dans :

docket hub - Official Images Windows

Ou dans :

Microsoft Containers Registry ... bas en fait non, on arrive directement dans le Dash board Azure c'est encore, à mon sens, une grosse cagade microsoft ... Je retourne dans DockerHub pour finalement trouver mon image.

En plus, je suis déjà connecté sur mon compte Azure avec le même navigateur et il ne s'en rend pas compte me reconnecte c'est tout un binse.

Microsoft Docker Hub
Encore un lien pour trouver une image docker ...

To Be Continued



Démarrer avec .NET Core, Docker et Microsoft Container Registry

Dans un article précédent je cite le blog de Scott Hanselman je trouve son article fort intéressant, je souhaite donc creuser .NET Core avec Docker et sur le Microsoft Container Registry. Si cela se trouve, je fais fausse route car ce n'est pas la bonne façon de faire mais je vais faire confiance à Scott.

Sacré Scott, me voilà bien, il me laisse avec trois notions à maitriser avant de comprendre ce qu'il a voulu dire par Démarrer avec .NET Core et Docker et MS Container Registry.

.NET Core : c'est le framework libre et open source et multiplateformes de Microsoft je sais dit comme cela c'est un peu bizarre mais c'est pourtant ça Microsoft s'est tourné depuis longtemps vers l'open source n'en déplaise à certains (en général des linuxiens).

Docker : Je commence à voir ce que c'est : plus léger qu'une machine virtuelle, il permet de faire tourner des applications sur toutes les plateformes. Un Container Docker est facilement déplaçable et installable sur une autre machine.

Alors Microsoft Container Registry c'est quoi ?
Ici : Microsoft Container Registry To replace Docker Hub for new images
On nous dit que Microsoft Container Registry va remplacer Docker Hub alors Docker Hub c'est quoi ? Sacré Scott.

Je dirais que c'est comme un Hub d'Images où l'on peut trouver des Images Docker à déployer. Il faut s'enregistrer ...

Docker Hub s'enregistrer pour récupérer une Image de Docker
MS Container Registry va héberger tous les nouvelles images Container de Windows Server 2019.

Voilà d'après la ligne de commande :

docker run --rm mcr.microsoft.com/dotnet/core/samples:dotnetapp

Scott utilise MS CR au lieu de Docker Hub.

Notez que les équipes Microsoft publient maintenant des images de conteneur sur le MCR (Microsoft Container Registry) afin de pouvoir utiliser le CDN Azure et en tirer un meilleur parti plus rapidement lorsqu'elles sont prochent de nous. Les images commencent à MCR et peuvent ensuite être syndiquées à d'autres registres de conteneurs.

Bon alors c'est quoi le CDN Azure ? Container Docker Network ... pfff.

Donc, peut-on dire que si l'on souhaite des Images Docker à terme, il vaudrait mieux aller les chercher chez MSCR ? Et que sinon on va dans Docker Hub ...

Install Docker

A priori Scott nous dit d'installer "Docker".

https://docs.docker.com/docker-for-windows/install/
Docker - Install Docker Desktop for Windows
Allons y !

Choisir les Containers Windows à la place des Containers Linux
Et puis un petit reboot ...

Docker Desktop 2.0.0.3
Une Icône sur le bureau ...
Docker Desktop
Et une série de messages ...

Docker - Windows 14393 is deprecated

Ca commence problème de compatibilité de version. Cette machine a été crée dans le Cloud il y a quelques mois à peine.
Docker - Hyper-V are not enabled
Là, je crois que je vais cliquer sur Ok ... un petit redémarrage ... Et donc maintenant on aurait les commandes de Scott à exécuter dans la console Docker pour installer et démarrer une application Web ASP.NET sur .NET Core ?

Vous y croyez ? Pas moi.

Docker - An error occurred
Voici le message d'erreur :

Unable to start: The running command stopped because the preference variable "ErrorActionPreference" or common parameter is set to Stop: 'MobyLinuxVM' failed to start.

Failed to start the virtual machine 'MobyLinuxVM' because one of the Hyper-V components is not running.

'MobyLinuxVM' failed to start. (Virtual machine ID 4C3FFD31-1791-4697-B6B9-309DE796DBD5)

The Virtual Machine Management Service failed to start the virtual machine 'MobyLinuxVM' because one of the Hyper-V components is not running (Virtual machine ID 4C3FFD31-1791-4697-B6B9-309DE796DBD5).
at Start-MobyLinuxVM, <No file>: line 296
at <ScriptBlock>, <No file>: line 412
at Docker.Core.Pipe.NamedPipeClient.Send(String action, Object[] parameters) in C:\workspaces\stable-18.09.x\src\github.com\docker\pinata\win\src\Docker.Core\pipe\NamedPipeClient.cs:line 36
at Docker.Actions.DoStart(SynchronizationContext syncCtx, Boolean showWelcomeWindow, Boolean executeAfterStartCleanup) in C:\workspaces\stable-18.09.x\src\github.com\docker\pinata\win\src\Docker.Windows\Actions.cs:line 92
at Docker.Actions.<>c__DisplayClass19_0.<Start>b__0() in C:\workspaces\stable-18.09.x\src\github.com\docker\pinata\win\src\Docker.Windows\Actions.cs:line 74
at Docker.WPF.TaskQueue.<>c__DisplayClass19_0.<.ctor>b__1() in C:\workspaces\stable-18.09.x\src\github.com\docker\pinata\win\src\Docker.WPF\TaskQueue.cs:line 59


Plutôt indigeste, MobyLinuxVM et pourtant j'ai choisi Windows ... et le bouton "Reset to factory defaults" allons-y pourquoi pas, rien n'y fait !



Tentative de relance après le reset :



Ok Ok Start ! Mais rien n'y fait CRASH !

Je relis la première phrase du Post de Scott Hanselman :

It's super easy to get started with .NET Core and/or ASP.NET Core with Docker. If you have Docker installed you don't need to install anything to try out .NET Core, of course.

En effet c'est super facile si vous avez Docker d'installé correctement sur votre machine par contre c'est super chiant d'installer Docker. Voir impossible car ma machine est virtuelle dans l'Azure alors je pense que la solution est plutôt là :

Azure - Instance de conteneur
Have fun? Not fun;-)