Cassini: anatomia del primo web server scritto in C#

di Daniele Bochicchio, in ASP.NET,

Nell'articolo dedicato a Web Matrix avevo dato l'annuncio dell'inclusione di un web server in grado di eseguire pagine ASP.NET indipendentemente da IIS.
Qualche giorno fa Microsoft ha rilasciato Cassini , ovvero il runtime ed il codice sorgente di questo web server.
Un altro tassello, anche questo gratuito, nella strategia di educazione degli sviluppatori a .NET che Microsoft sta perseguendo ormai da qualche tempo.

In questo articolo cercheremo di capire un attimo come sfruttare al meglio questo web server dal punto di vista architetturale: al giorno d'oggi è forse uno dei migliori esempi di coding di applicazioni C#.

Il download

Cassini è poco più di 200 kb, sotto forma di un eseguibile autoscompattante che altro non fa che tirare fuori i codici sorgente (*.cs), un'icona per l'applicazione che controlla il server web, un readme ed un build.bat che compila tutto l'occorrente.
Lo si può scaricare da ASP.NET , e tra l'altro il link è in bella vista anche sulla home.
Per onor del vero il codice sorgente di questo che ora è Cassini è identico al server web incluso in Web Matrix, come già detto.

In seguito alle pressioni degli sviluppatori, ma anche grazie ad una nuova strategia di accesso al know-how, oggi è possibile dare un'occhiata da vicino a questo nuovo sistema.

La struttura

Dal punto di vista architetturala, Cassini si presenta come un'assembly (una DLL, Cassini.dll) che implementa il web server vero e proprio attraverso le classi contenute nel namespace Cassini.
Questo assembly è dato dall'unione di 8 classi (ed altrettanti file) differenti:

  • AssemblyInfo.cs : contiene le informazioni sull'assembly
  • ByteParser.cs : classe che permette di fare il parsing di un array di byte senza effettuare la conversione in stringa
  • ByteString.cs : classe utilizzato per il parsing delle header HTTP
  • Connection.cs : classe interna che appoggiandosi al namespace System.Net implementa la struttura logica necessaria ad implementare le connessioni con i client sul protocolo HTTP
  • Host.cs : in collaborazione con Connection, permette di ascoltare su una determinata porta le richieste in ingresso.
  • Messages.cs : classe interna utilizzata per la formattazione delle stringhe nelle risposte HTTP
  • Request.cs : contiene i riferimenti all'implementazione della classe HttpRequest di ASP.NET
  • Server.cs : l'unica classe pubblica, mette a disposizione delle API pubbliche per avviare o fermare il web server, cambiare il path di esecuzion, etc.

Come è possibile che in sole 8 classi venga implementato un intero web server? La risposta sta nel namespace System.Web.Hosting, che espone alcune funzionalità che permettono di utilizzare il runtime ASP.NET al di fuori del worker process utilizzato da IIS, o meglio di sfruttarlo all'interno di altre applicazioni, come è appunto Cassini.

Sicuro by default

Cassini gira sulla porta 8080, non serve altri tipi di applicazioni se non .NET, non accetta richieste dall'esterno (ovvero, accetta richieste solo dallo stesso indirizzo IP di localhost).
Ovviamente quest'ultima limitazione è aggirabile, basta agire su Connection.cs, linea 58, e modificare il valore di ritorno della property IsLocal. :)

Basta restituire sempre true per avere un web server attivo su una intranet, ad esempio. Ne ho fatto una versione (funzionante) di questo tipo e devo dire che non è niente male.
In realtà avrei in programma (tempo permettendo!) di implementare un controllo sugli IP specificati in un file di configurazione, un po' come fa IIS: non sarebbe niente male poterne modificare il comportamento!

Ad ogni modo, queste due caratteristiche che abbiamo appena visto sono necessarie per garantire al web server di non essere mai esposto all'esterno e quindi di essere immune ad eventuali exploit ed attacchi remoti.

2 pagine in totale: 1 2
Contenuti dell'articolo

Commenti

Visualizza/aggiungi commenti

| Condividi su: Twitter, Facebook, LinkedIn

Per inserire un commento, devi avere un account.

Fai il login e torna a questa pagina, oppure registrati alla nostra community.

Approfondimenti