in Architettura Software, Informatica

Novità in ASP.NET Core 10: Sviluppo in Locale con il dominio di primo livello localhost

L’esperienza di sviluppo locale è fondamentale per la produttività di ogni sviluppatore. Con ASP.NET Core 10, Microsoft compie un passo significativo introducendo il supporto nativo e completo per il dominio di primo livello (TLD) riservato .localhost. Questa novità non è solo una comodità, ma una miglioria architetturale che rende lo sviluppo di microservizi, API e frontend in locale molto più efficiente e pulito.

localhost:porta

Fino ad ASP.NET Core 9, la configurazione standard per tutte le applicazioni in esecuzione sul tuo computer era basata sull’hostname generico localhost seguito da una porta specifica (es. https://localhost:7001). Questo approccio, sebbene funzionale, presenta delle criticità quando si lavora su progetti complessi o multipli:

  1. Conflitti di Cookie: Se stavi sviluppando un’API e un’applicazione frontend che richiedevano autenticazione e che condividevano entrambe il dominio localhost, i cookie di autenticazione potevano facilmente entrare in conflitto o sovrapporsi, causando sessioni instabili o problemi di isolamento.
  2. Mancanza di Significato: Un URL come https://localhost:7001 non è descrittivo. Per sapere a quale progetto corrisponde, dovevi fare affidamento solo sul numero di porta.
  3. Configurazione Inadeguata per i Microservizi: In uno scenario di microservizi, dove decine di servizi comunicano tra loro, non potevi simulare un ambiente di produzione in cui ogni servizio ha un suo nome host univoco (ad esempio, api-utenti.miodominio.it).

Il Potere dell’Isolamento con .localhost

Il dominio .localhost è formalmente specificato nelle RFC 2606 e 6761 e gode di un trattamento speciale da parte di browser e sistemi operativi: si risolve sempre all’indirizzo di loopback locale (127.0.0.1 o ::1) senza bisogno di modifiche al file hosts.

ASP.NET Core 10 sfrutta questo standard. Il server Kestrel è stato aggiornato per accettare automaticamente come valide le richieste per qualsiasi nome host che termina con .localhost.

Vantaggi Tecnici

  • Isolamento Perfetto dei Cookie: Poiché ogni app avrà un nome host distinto (es. frontend.localhost e backend.localhost), i cookie associati non interferiranno più tra loro. Questo è cruciale per testare flussi di autenticazione come OAuth o OpenID Connect che si basano sull’isolamento del dominio.
  • Chiarezza e Debug: La navigazione e il debugging diventano immediati. Quando vedi un errore o un log proveniente da api-prodotti.localhost, sai esattamente quale parte del sistema è coinvolta.
  • Simulazione del Cloud: Puoi replicare in modo più fedele l’architettura dei tuoi ambienti di staging o produzione in cui i microservizi sono raggiunti tramite nomi DNS univoci.

Configurazione Dettagliata in ASP.NET Core 10

Per abilitare questa funzionalità, devi solo configurare gli URL della tua applicazione. Non sono richieste modifiche al file hosts o permessi amministrativi.

1. Modifica di launchSettings.json (Consigliato)

Questo è l’approccio più comune per lo sviluppo. All’interno della cartella Properties, apri il file launchSettings.json e aggiorna la sezione applicationUrl del tuo profilo (ad esempio, il profilo chiamato “MyApp”):

{
  "profiles": {
    "MyApp": {
      "commandName": "Project",
      "launchBrowser": true,
      // ✨ La nuova configurazione per .localhost ✨
      "applicationUrl": "https://mia-app.localhost:7001;http://mia-app.localhost:5001",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Development"
      }
    },
    // ... altri profili
  }
}

Quando avvierai il progetto tramite Visual Studio o con dotnet run, l’applicazione sarà accessibile all’indirizzo https://mia-app.localhost:7001.

2. Utilizzo della Variabile d’Ambiente

Per ambienti CI/CD locali o se esegui Kestrel direttamente da linea di comando (CLI), puoi usare la variabile d’ambiente ASPNETCORE_URLS:

Bash

# Sostituisci la porta standard 
set ASPNETCORE_URLS=https://api-servizio.localhost:7001 

# Avvia l'app
dotnet run

Un Semplice Flusso di Lavoro Esempio

Immagina di sviluppare un sistema con tre componenti:

ComponenteVecchio URLNuovo URL con .localhost
API Utentihttps://localhost:7001https://**users-api.localhost**:7001
API Prodottihttps://localhost:7002https://**products-api.localhost**:7002
Frontendhttps://localhost:7003https://**ui.localhost**:7003

Con la nuova configurazione, non solo i cookie saranno isolati, ma la configurazione del tuo frontend per chiamare le API sarà identica a quella che useresti in produzione:

// Configurazione del client HTTP nel Frontend
builder.Services.AddHttpClient("UsersApi", client =>
{
    // L'URL è descrittivo e isolato!
    client.BaseAddress = new Uri("https://users-api.localhost:7001");
});

Questo elimina la necessità di complicate logiche condizionali per distinguere tra URL di sviluppo e URL di produzione, migliorando la coerenza del codice.

Il supporto a .localhost in ASP.NET Core 10 è un’evoluzione che eleva lo standard dello sviluppo web, offrendo chiarezza, isolamento e una replica più fedele dell’ambiente di produzione.