MVAESTECH
Guide .NET · 07 · Applications

Publié le · par Mathieu Vaes

Communication & legacy

REST n'est qu'un moyen parmi d'autres de faire dialoguer des applications. Et dans la plupart des entreprises, le vrai sujet est de faire évoluer l'existant .NET Framework sans tout arrêter.

Chapitres du guide
En clair

Les applications se parlent de plusieurs façons : question-réponse immédiate (REST, gRPC), temps réel où le serveur pousse les nouvelles (SignalR), ou messages déposés dans une boîte aux lettres que le destinataire lira quand il pourra (Pub/Sub). Et beaucoup d'entreprises ont du code ancien qu'il faut moderniser pièce par pièce, comme on rénove une maison en continuant d'y habiter.

Les bases réseau Junior

Client Serveur 1 · DNS : api.shop.fr → 34.155.12.8 TCP SYN SYN-ACK TLS ClientHello (versions, algorithmes) ServerHello + certificat GET /v1/orders/42 (chiffré) 200 OK + JSON
Résoudre le nom, ouvrir la connexion TCP, négocier TLS, puis échanger. Réutiliser les connexions (keep-alive, IHttpClientFactory) évite de payer ces allers-retours à chaque appel.
Version HTTPTransportApport
HTTP/1.1TCPUne requête à la fois par connexion
HTTP/2TCPMultiplexage de plusieurs requêtes sur une connexion ; requis par gRPC
HTTP/3QUIC (UDP)Pas de blocage en tête de file, meilleur sur réseau mobile ; supporté par Kestrel

Choisir un mode de communication Confirmé

ModeFormatPourLimites
REST / JSONTexte, lisibleAPI publiques, navigateurs, partenairesContrat moins strict, plus verbeux
gRPCProtobuf binaire, HTTP/2Appels entre services internes, streamingNavigateur seulement via gRPC-Web ; débogage moins direct
SignalRWebSocket (repli SSE, long polling)Temps réel : notifications, tableaux de bord, chatConnexions longues, scale-out à prévoir
GraphQLJSON, une requête qui choisit ses champsFront-ends aux besoins variésCache HTTP difficile, coût des requêtes à borner
Messages (Pub/Sub, RabbitMQ)Au choixDécouplage, traitements asynchrones, pics de chargeCohérence éventuelle, idempotence obligatoire

orders.proto — le contrat gRPC génère client et serveur

syntax = "proto3";
option csharp_namespace = "Shop.Grpc";

service OrderService {
  rpc GetOrder (GetOrderRequest) returns (OrderReply);
  rpc WatchStatus (GetOrderRequest) returns (stream StatusUpdate);   // streaming serveur
}

message GetOrderRequest { string order_id = 1; }
message OrderReply      { string order_id = 1; string status = 2; int64 total_cents = 3; }
message StatusUpdate    { string status = 1; }

Ne renumérotez jamais un champ Protobuf existant : le numéro est le contrat sur le fil. Pour retirer un champ, marquez-le reserved.

SignalR à plusieurs instances

Chaque client est connecté à une seule instance. Pour qu'un message atteigne tous les clients, il faut un backplane (Redis / Memorystore) ou un service managé, et des sessions persistantes (affinité) quand le repli long polling est autorisé. Sur Cloud Run, activer l'affinité de session et dimensionner la durée maximale des requêtes, car une connexion WebSocket compte comme une requête longue.

Moderniser l'existant .NET Framework Senior

Réécrire d'un coup est le chemin le plus risqué. Le pattern strangler fig (figuier étrangleur) place une façade devant l'ancienne appli : chaque route migrée est servie par la nouvelle, le reste continue de partir vers l'ancienne, jusqu'à ce qu'elle soit vide.

Utilisateursmêmes URL Nouvelle appli .NET 10+ proxy YARP intégréroutes migrées servies ici /orders, /catalogendpoints .NET 10 Appli ASP.NET MVC 5.NET Framework 4.8 · IIS rétrécit àchaque sprint
Orange : routes déjà migrées. Bleu : tout le reste, relayé tel quel vers l'ancienne appli. Les adaptateurs System.Web permettent de partager session et authentification entre les deux pendant la transition.

Feuille de route de migration

  1. Inventaire : dépendances NuGet sans version .NET moderne, API Windows-only, usages de System.Web, WCF, Remoting, AppDomains.
  2. Projets au format SDK et PackageReference à la place de packages.config, encore sur .NET Framework.
  3. Bibliothèques en netstandard2.0 (ou multi-cible net48;net10.0) : elles servent l'ancien et le nouveau code.
  4. Façade YARP et migration route par route, en commençant par les écrans à forte valeur ou faible risque.
  5. Remplacements : ConfigurationManager → IConfiguration, HttpContext.Current → injection d'IHttpContextAccessor ou paramètres, Global.asax → middleware, HttpModules → middleware.
  6. Retrait de l'ancienne appli quand plus aucune route n'y aboutit (le surveiller par les logs du proxy).

Côté outillage, Microsoft oriente désormais la migration assistée vers la modernisation par GitHub Copilot dans Visual Studio, l'ancien .NET Upgrade Assistant n'étant plus mis en avant. Dans tous les cas, un outil accélère la mécanique, il ne remplace pas l'inventaire ni les tests de non-régression.

Et WCF ?

SituationOption
Appeler un service WCF existant depuis .NET 10Packages clients System.ServiceModel.* (dotnet-svcutil pour générer le proxy)
Héberger des contrats WCF sur .NET moderne avec un minimum de changementsCoreWCF (open source, soutenu par Microsoft) : BasicHttp, NetTcp, WSHttp et d'autres, sous-ensemble de WCF
Nouveau contrat entre services internesgRPC
Contrat exposé à des clients variésAPI REST + OpenAPI
Piège
  • Big bang : une réécriture complète gèle les évolutions pendant des mois et rate presque toujours des règles métier implicites.
  • Comportements cachés : sérialisation (dates, DataContractSerializer vs System.Text.Json), culture par défaut, encodage. Comparer les réponses de l'ancien et du nouveau sur les mêmes entrées.
  • Timeouts gRPC absents : toujours fixer une deadline sur l'appel, sinon un appel peut attendre indéfiniment.

À retenir

  • REST pour l'externe, gRPC pour l'interne, SignalR pour le temps réel, messages pour découpler.
  • Migration progressive derrière une façade YARP, jamais de big bang.
  • WCF : CoreWCF pour conserver, gRPC ou REST pour les nouveaux contrats.

Un projet .NET à cadrer ou à reprendre ?

API REST documentées et testées, applications ASP.NET MVC (y compris VB.NET), migration de services anciens vers une architecture claire : parlons de votre code.