delete

Contattaci

back to resources

The chosen one: .NET 5

data
7/9/2021
data progetto
autore
social
cliente
partnership
url
No items found.

The chosen one: .NET 5

.NET 5, il successore di .NET Core 3.1 e .NETFramework 4.8, mira a fornire agli sviluppatori .NET una nuova esperienza disviluppo multipiattaforma. Mette ordine alla frammentazione dell'universo .NETche si è verificata nel corso degli anni e apporta nuove straordinariefunzionalità. Di seguito i cinque punti su cui concentrarci per capireagevolmente quali sono i punti di forza dell’ultima release per glisviluppatori di casa Microsoft.

1. Piattaforma Unificata

La prima cosa che c’è da sapere è che .NET 5offre una nuova visione unificata del mondo .NET.

Se abbiamo già lavorato con .NET, dovremmoessere a conoscenza della sua frammentazione di piattaforme sin dalla sua primaversione nel 2002. .NET Framework è stato inizialmente progettato per Windows,ma la sua specifica di runtime, nota anche come Common Language Infrastructure(CLI), fu standardizzata come ECMA335.

Questa standardizzazione consentì a chiunquedi creare la propria implementazione del runtime .NET. Infatti non si attesemolto per veder comparirne i primi all’orizzonte: abbiamo Mono per sistemibasati su Linux, Silverlightper applicazioni basate su browser, framework .NET Compacte Microper dispositivi mobili e con risorse limitate e così via.

Per questi motivi, Microsoft decise discrivere .NET Core da zero pensando esclusivamente alla compatibilitàmultipiattaforma. Queste diverse implementazioni hanno sollevato la necessitàdi capire “dove” potrebbe essere eseguito un pacchetto .NET.

Dovresti creare versioni diverse della tualibreria per distribuirla? La risposta a questa domanda fu .NET Standard,ovvero una specifica formale delle API comuni che dovresti aspettarti tra leimplementazioni della CLI. In altre parole, se crei la tua libreria per unospecifico .NET Standard, avrai la garanzia che verrà eseguita su tutti iruntime che implementano tale specifica.

Si comprende dunque che, in questa situazionedisordinata, la compatibilità di implementazione desiderata non era così facileda ottenere. Questo è il motivo per cui .NET 5 appare in scena.

La nuova piattaforma .NET è il successoreunificato delle varie versioni .NET: .NET Framework, .NET Standard, .NET Core,Mono, ecc. È ufficialmente la prossima versione di .NET Core 3.1, masostanzialmente determina la fine di .NET Framework, .NET Standarde le altre varianti che hanno causato grossi grattacapi agli sviluppatori .NET.

.NET 5 fornisce un set comune di API cheallinea le diverse implementazioni di runtime. Questo set di API è identificatodal Net5.0 Target Framework Moniker (TFM), che è il token impostato nelprogetto .NET per specificare il framework di destinazione. Ciò consentel'esecuzione dell'applicazione su qualsiasi implementazione di runtime chesupporta .NET 5. Tuttavia, è comunque possibile compilare applicazioni per unapiattaforma specifica. Ad esempio, per creare un'applicazione che utilizzal'API di Windows, è necessario specificare il TFM net5.0-windows. In questomodo, la creazione di un'applicazione specifica per la piattaforma è una tuascelta, non una scelta che dipende dall'implementazione di runtime che staiutilizzando per sviluppare la tua applicazione.

Naturalmente, realizzare questa piattaformaunificata ha richiesto uno sforzo significativo e una riorganizzazionedell'architettura interna. Alcune funzionalità sono state rimosse dal set diAPI di base, come vedrai più avanti, ma la piattaforma ha ottenuto unmiglioramento generale delle prestazioni.

Mentre il nuovo .NET 5 viene fornito con l'obiettivo di unificazione della piattaforma, il piano iniziale è cambiato a causa del COVID-19. In effetti, .NET 5 pone le basi dell'unificazione, ma sarà completato con .NET 6 a novembre 2021. Con tale rilascio, otterremo la versione stabile della nuova Universal UI ed anche il supporto per i TFM specifici per Android ( net6.0-android) e iOS (net6.0-ios).

2. Nuove funzionalità in C#

La seconda cosa da tenere a mente riguarda C#..NET 5 include C# 9, la nuova versione del principale linguaggio diprogrammazione della piattaforma .NET. Ci sono diverse nuove funzionalità, e diseguito ne troveremo un piccolissimo assaggio, giusto per farci “venir fame”.

Dichiarazioni Top-Level

Tra le nuove funzionalità, una delle piùnotevoli è l'introduzione di dichiarazioni top-level (o di primo livello). Persapere cosa sono, diamo un'occhiata al seguente programma:

Ebbene, il precedente blocco potrà esseretranquillamente sostituito dal semplice ed unico:

Le istruzioni top-level consentono diconcentrarsi su ciò che conta davvero in piccoli programmi e utilità perconsole e utilizzare C# con un approccio più orientato agli script.

Tipi di record

Un'altra interessante novità sono i tipi direcord. Con i record, possiamo dichiarare un tipo di riferimento immutabile,ovvero un tipo basato sulla classe che non può essere modificato dopo la suacreazione. Un esempio di tipo di riferimento immutabile incorporato è la classeSystem.String. Dopo aver creato un'istanza di System.String, non è piùpossibile modificarne il valore.

Considera la seguente dichiarazione del tipo di record:

Possiamo creare un istanza del record Personcome faremmo per una classe, ma non ne possiamo alterare ad esempio laproprietà FirstName.

Potremo comunque confrontare due istanze delrecord Person come si trattassero di tipologie primitive:

Init setters

C# 9 aggiunge anche la funzione di initsetters per definire proprietà che possono essere solo inizializzate.Consideriamo la seguente definizione di classe:

Questa classe definisce una persona con proprietà LastName e FirstName che possono essere inizializzate, ma non modificate. La proprietà Address può essere invece modificata in qualsiasi momento:

3. .NET MAUI, the Universal UI

Come terzo punto, dobbiamo sapere che .NET 5offre un nuovo modo di creare interfacce utente multipiattaforma. Grazie alframework UI dell'app multipiattaforma .NET, noto anche come .NET MAUI, saremoin grado di creare interfacce utente per Android, iOS, macOS e Windows con ununico progetto.

In realtà, questa funzionalità è ancora incorso e verrà rilasciata con .NET 6, ma possiamo iniziare a dareun'occhiata a .NET MAUI per essere pronto quando verrà rilasciato ufficialmentefin dal .NET 5.

.NET MAUI può essere considerato un'evoluzionedi Xamarin.Forms, il framework open source per la creazione di app iOS eAndroid con un'unica base di codice .NET. Ma questo nuovo framework propone unmodello universale per la creazione di interfacce utente su piattaforme mobilie desktop.

.NET MAUI

Oltre al buon vecchio Model-View-ViewModel(MVVM) pattern, .NET MAUI supporta anche il recentissimo Model-View-Update(MVU).

4. Supporto Single-File Applications

Altra grande feature che otterremo in .NET 5 èil supporto alle single-file applications, ovvero applicazioni pubblicate edistribuite come un singolo file. Ciò significa che la nostra applicazione etutte le sue dipendenze sono raggruppate in un unico file.

Ad esempio, supponiamo di eseguire il seguentecomando all'interno della cartella del nostro progetto .NET 5:

Otterremo un singolo file contenente l’interaapplicazione creata per Linux, tutte le dipendenze usate nel  progetto ed il runtime .NET (--self-containedtrue). Ciò significa che non è nemmeno necessario installare il runtime .NETsul computer/server di destinazione.

Naturalmente, si potranno specificare questi parametri nella configurazione del progetto:

Notate bene che questa funzionalità non usa lostesso approccio delle applicazioni a file singolo che puoi compilare in .NETCore 3.1. In .NET Core 3.1. L'applicazione a file singolo è solo un modo percreare pacchetti binari: in fase di esecuzione vengono poi scompattati in unacartella temporanea, caricati ed eseguiti. In .NET 5, l'applicazione a filesingolo ha una nuova struttura interna e viene eseguita direttamente senzapenalizzazioni delle prestazioni.

A questolink è possibile trovare la documentazione di questa tipologia di rilascio.

5. Tecnologie non più supportate

Per ultimo punto, è obbligo parlare anche dichi esce dal ciclo delle tecnologie supportate, non solo dei nuovi arrivati.

Come detto sopra, la revisionedell'architettura e il tentativo di rendere .NET 5 un vero e proprio frameworkdi programmazione multipiattaforma ha portato alla rimozione di alcunefunzionalità supportate in .NET Framework. Diamo una rapida occhiata allefunzionalità rimosse e alle possibili alternative.

Web Forms

Per molto tempo, ASP.NET Web Forms è stata laprincipale tecnologia per creare interfacce utente web dinamiche. Tuttavia, nonè un segreto che la sua durata fosse strettamente legata al destino di .NETFramework. .NET Core non supporta Web Form, quindi il fatto che non sia piùsupportato in .NET 5 non dovrebbe essere una grande novità.

Tuttavia, abbiamo alcune alternative percreare interfacce utente web. Se stiamo realizzando applicazioni webtradizionali, Razor Pages è una di queste alternative. Se vuoi creareapplicazioni a pagina singola, puoi usare invece Blazor.

Windows Communication Foundation (WCF)

Anche WCF, il framework di comunicazionetradizionale per Windows, sarà deprecato. Questo può sembrare un po' scioccanteper gli sviluppatori che lo hanno utilizzato per creare le loro applicazioniorientate ai servizi. Tuttavia, è abbastanza comprensibile se ci rendiamo contoche l'obiettivo principale di .NET 5 è diventare un framework multipiattaforma.

L'alternativa a WCF consigliata da Microsoft èla migrazione a gRPC.Ma se abbiamo nostalgia di WCF o vuoi preparare una transizione graduale, puoiprovare il progetto open source CoreWCF.

Windows Workflow Foundation

Infine, .NET 5 non includerà nemmeno WindowsWorkflow Foundation, la tecnologia del motore del flusso di lavoro disponibilein .NET Framework. Non esiste un sostituto ufficiale per questa tecnologia.Tuttavia, potremo usare un progetto di porting open source, CoreWF, per tentare di spostare iflussi di lavoro esistenti su .NET 5 o crearne di nuovi.

PrimiPassi Insieme

Nella seconda parte di questo articolosperimenteremo insieme la creazione di un nuovo progetto web tramite VisualStudio sfruttando il framework .NET 5 e mettendo subito alla prova il suoaspetto multipiattaforma, pubblicandolo su di una macchina Linux (Ubuntu).

Non temiate la lunghezza della scrollbarverticale del vostro browser, la guida è stata resa il più user-friendlypossibile riportando intere porzioni di codice e schermate dei “punti salienti”,ecco spiegato il motivo della sua lunghezza.

Creiamoil nuovo progetto con Visual Studio

Creiamo il nuovo progetto cross platform “MyCrossPlatformApp”partendo dal template “ASP.NET Core Web App”. Se non si trova ilsuddetto template tra quelli disponibili, assicurarsi di aver selezionato lavoce “All platforms” e soprattutto che sia installata sul vostro Visual Studiola relativa SDK.

NB! E’ essenzialeselezionare come Target Framework -> .NET 5

Una volta completato lo scaffolding del nuovoprogetto possiamo tranquillamente procedere con la sua pubblicazione.

Non sono necessarie ulteriori modificheessendo il nostro obiettivo ultimo l’esecuzione del progetto su una macchinaLinux. Possiamo comunque provare a far partire il progetto per assicurarci chenon contenga errori (e che Visual Studio non stia tentando di nascosto disabotarci…).

Il risultato sarà la classica pagina dibenvenuto del template selezionato.

Eradicati i nostri dubbi riguardo la bontàdella compilazione del progetto, possiamo finalmente pubblicarlo.

Il risultato della pubblicazione sarà unacartella contenente exe, dll e files di configurazione del nostro applicativo,compilati per il rilascio sulla nostra piattaforma desiderata.

Procediamo dunque cliccando col destro sullanostra soluzione nell’explorer di Visual Studio e selezionado la voce Publish.

Questo avvierà il wizard di creazione di unnuovo Profilo di Pubblicazione.

Delle varie modalità di pubblicazione,sceglieremo la più grezza e legacy, ovvero la pubblicazione su cartella/folder.In questo modo, lasciando tutte le impostazioni di default proposte nellasuccessiva schermata, avremo il nostro risultato nella sotto cartella di progettobin\Release\net5.0\publish .

Una volta creato il nuovo profilo dipubblicazione possiamo procedere cliccando dapprima su Publish (1) ed inseguito esaminando il risultato cliccando sulla cartella di output (2).

Et voilà! Unavolta terminata la pubblicazione su cartella possiamo chiudere con VisualStudio ed iniziare a dedicarci alla nostra macchina Linux. Essendo il progettocompilato con un framework multipiattaforma (.NET5), nella cartella bin\Release\net5.0\publishavremo tutto il necessario per far partire l’app su qualsiasi SistemaOperativo in cui è installabile la relativa runtime.

Di seguito procederemo con la pubblicazionesull’ultima versione server Debian e l’ultima versione long-term support diUbuntu Server.

UBUNTU 20.04 LTS &  Apache

Prerequisiti

  1. Salvo particolarissime eccezioni oesigenze, sarebbe ideale cominciare a riscaldarci sul terminale con la solitasfilza di formalismi necessari a partire con tutti i repositori e pacchettiaggiornati:
  2. sudo apt-get update
  3. sudo apt-get upgrade
  4. sudo apt-get dist-upgrade
  5. sudo apt-get autoclean
  6. sudo apt-get autoremove

  7. Nonostante sia un appunto banale eper molti scontato, tengo a precisare che per trasferire il nostro progetto sulserver Ubuntu in questa guida faremo uso del protocollo SFTP. Sarà dunquenecessario installare sulla macchina in questione la versione server di SSH (senon già presente) con il comando:
  8. sudo apt-get installopenssh-server

Step#1 – Installazione Runtimes

Per prima cosa dobbiamo assicurarci che sianoinstallate le runtime di .NET5 e ASP.NET Core 5. Procediamo conil seguente comando per listarle tutte:

dotnet --list-runtimes

Se il risultato dovesse essere il seguente(“command not found”) allora dobbiamo fare un passetto indietro, installandonealmeno una.

Installare le runtime .NET non è complicato.
come già visto per l’SSH, possiamo tranquillamente procedere con la loroinstallazione tramite il packet manager di Ubuntu apt:

  • Runtime .NET5
    sudo apt-get installdotnet-runtime-5.0
  • Runtime ASP.NET Core 5
    sudo apt-get installaspnetcore-runtime-5.0

Con gran probabilità, arrivati a questo puntovi scontrerete con la mancanza dei pacchetti dotnet-runtime-5.0 e aspnetcore-runtime-5.0negli attuali repository della vostra macchina, come da screen di seguito (“Unableto locate package (…)”) .

Non disperate: oltre alla guida ufficialeMicrosoft per l’aggiunta del repository (LINK)potrete nuovamente fare affidamento a quanto segue di questa guida. Infatti,per l’aggiunta dei repository ufficiali Microsoft sul nostro server Ubuntubasterà eseguire i seguenti comandi:

curl -sSLhttps://packages.microsoft.com/keys/microsoft.asc | sudo tee/etc/apt/trusted.gpg.d/microsoft.asc
sudoapt-add-repository https://packages.microsoft.com/ubuntu/20.04/prod
sudo apt-get update

A questo punto saremo in grado di ritentarecon successo l’installazione delle runtime .NET come descritto poche righe addietro,assicurandoci infine che compaiano nella lista fornita dal comando:

dotnet --list-runtimes

Step#2 – Installazione & Config. Apache

Dobbiamo sapere che le applicazioni .Netvengono eseguite su server Kestrel. Il nostro web server Apache fungeràda server proxy e gestirà il traffico dall’esterno della macchinareindirizzandolo al server Kestrel. Possiamo dunque vedere il nostro web serverApache come un middle layer per l’applicazione .Net .

Di seguito vedremo come installare econfigurare un’installazione pulita di Apache sul nostro server Ubuntu perservire la nostra applicazione.

Diamo quindi i seguenti comando per installareApache ed abilitare in seconda battutati i moduli proxy,proxy_http,proxy_html e proxy_wstunnel.

sudo apt-get install apache2
sudo a2enmod proxy proxy_http proxy_html proxy_wstunnel
sudo a2enmod rewrite
systemctl restart apache2

Possiamo confermare la corretta installazionedi Apache navigando con un browser all’indirizzo del nostro server. Se tutto èandato liscio, il risultato sarà la pagina di default di Apache con tanto dimessaggio evidenziato IT WORKS come da screen:

Arrivati a questo punto,dovremo creare un fileconf per configurare il nostro proxy su Apache.
Forniamo dunque il seguente comando per entrare nell’editor di testo nano :

sudo nano /etc/apache2/conf-enabled/netcore.conf

Copiamo ora la seguente configurazione nelfile vuoto appena aperto per poi salvarlo con la combinazione (per chi non laconoscesse) CTRL+O -> INVIO -> CTRL+X .

NB! La porta 5000è quella usata di default dal server Kestrel con cui si eseguono leapplicazioni .Net

<VirtualHost *:80> 
   ServerName localhost 
   ProxyPreserveHost On 
   ProxyPass / http://127.0.0.1:5000/
   ProxyPassReverse /http://127.0.0.1:5000/ 
   RewriteEngine on 
   RewriteCond %{HTTP:UPGRADE}^WebSocket$ [NC] 
   RewriteCond %{HTTP:CONNECTION}Upgrade$ [NC] 
   RewriteRule /(.*)ws://127.0.0.1:5000/$1 [P] 
   ErrorLog/var/log/apache2/netcore-error.log 
   CustomLog/var/log/apache2/netcore-access.log common 
</VirtualHost>

Ora con il seguente comando ci assicuriamo chenon siano presenti errori nella configurazione appena create su Apache:

sudo apachectl configtest

A prescindere dai vari warning segnati, sericeviamo infine il messaggio Syntax OK possiamo procedere con ilriavvio di Apache:

sudo service apache2 restart

Effettuando nuovamente la navigazione con unbrowser puntando all’indirizzo della nostra macchina, ci accorgeremo di nonavere più la pagina di default di Apache esposta, bensì un messaggio di ServiceUnavailable . Risultato del tutto normale poiché Apache sta giàfunzionando da server proxy, mirando in realtà alla porta 5000 della macchina sullaquale non è ancora stata avviata la nostra applicazione .Net conKestrel.

Step#3– Spostamento Progetto & Creazione Servizio

E’giunto ora il momento di riversare il nostro progetto compilato sul nostroserver Linux.

Comeanticipato nelle premesse di questa guida, uno degli strumenti più comodi perchi lavora su una macchina Windows è WinSCP, con il quale potremo trasferirefiles tramite SFTP.

Primadi spostare i files, sarebbe utile creare preventivamente la cartella didestinazione del progetto, che nel nostro caso si chiamerà MyCrossPlatformAppe sarà nella home della mia utenza cerini.

cd /home/cerini
mkdir MyCrossPlatformApp

Ecco che una volta connessi con WinSCP potremospostare comodamente il progetto nella cartella appena creata anche con unsemplice Drag&Drop.

Possiamofinalmente testare il corretto funzionamento della nostra soluzione crossplatform e della bontà della configurazione del reverse proxy di Apacheavviando l’applicazione e facendo di conseguenza partire il server Kestrelsulla porta 5000 col comando:

dotnet MyCrossPlatformApp.dll

Visitandonuovamente col browser la nostra macchina, il messaggio di “ServiceUnavailable” sarà soltanto un lontano ricordo.

Rimanesoltanto un ultimo “problema”:
l’esecuzione dell’applicazione è contestualizzata all’istanza di terminale cheha lanciato il comando dot, dunque fin quando non ne termineremol’esecuzione con la combinazione di comandi CTRL+C, l’istanza di questoterminale sarà occupata da questo unico job, impedendoci di usarla perqualsiasi altro task.

E’qui che entrano in gioco i service di Ubuntu. Un service (o serviziose preferite in italiano) su Ubuntu costituisce la gestione regolarizzatadi uno o più processi in totale autonomia dell’OS ed in background.

Trai vari parametri configurabili di un servizio, troviamo quelli che nedefiniscono il tempo di esecuzione, partenza e comportamento in caso di errore,come ad esempio il riavvio od un nuovo tentativo ad una certa distanzatemporale.

Iservizi su Ubuntu sono facilmente gestibili con il comando service o ilsuo sinonimo systemctl, fornendo come parametro l’operazione daeffettuare sul servizio specificato:enalbe, disable, stop,start, restart e status.

Creiamodunque il file di configurazione per il servizio che si occuperà di avviare (etenere avviata) la nostra applicazione .NET sul server.
Come in precedenza, usiamo l’editor nano per creare il suddetto file:

sudo nano/etc/systemd/system/MyCrossPlatformApp.service

Avviatol’editor del nuovo file vuoto, possiamo copiare al suo interno la seguenteconfigurazione, salvandola infine con CTRL+O -> INVIO-> CTRL+X :

[Unit]

Description=ASP .NET Web Application

[Service]

WorkingDirectory=/home/cerini/MyCrossPlatformApp

ExecStart=/usr/bin/dotnet /home/cerini/MyCrossPlatformApp/MyCrossPlatformApp.dll

Restart=always

# Restart service after 10 seconds if the dotnet service crashes:

RestartSec=10

SyslogIdentifier=dotnet5-demo

User=www-data

Environment=ASPNETCORE_ENVIRONMENT=Production

[Install]

WantedBy=multi-user.target


Tra le config più interessanti troviamo la WorkingDirectory con cuidiamo il contesto della cartella di esecuzione, ExecStart che definisceil vero e proprio comando da eseguire (dotnet + dll), Restart e RestartSeccon cui definiamo il comportamento in caso di errore/crash del servizio.

Possiamodunque abilitare il servizio e tentarne l’avvio:

sudo systemctl enableMyCrossPlatformApp

sudo systemctl startMyCrossPlatformAppt

Controlliamoinfine che sia correttamente partito con:

sudo systemctl statusMyCrossPlatformApp

Laprova del nove la potrete tranquillamente avere navigando come al solito dalvostro browser.

Provareper credere! E se vi sentite fortunati (e ne avete la possibilità) provate ariavviare il vostro server: il servizio avvierà la vostra applicazione .NETautomaticamente una volta ripartito Ubuntu.

Articolo a cura di Luca Cerini, Senior Developer in Orbyta Tech, 07/09/2021

Risultati

resources

Quick Escape Room

Quick Escape Room

Orbyta Invaders Ignition

Orbyta Invaders Ignition

Il lancio della nuova Identity di Orbyta parte dal Metaverso!

Il lancio della nuova Identity di Orbyta parte dal Metaverso!

development

design

metaverse

brand identity

Database a grafo in SQL Server

Database a grafo in SQL Server

Data Science Job Roles

Data Science Job Roles

Teoria dei giochi: Propagazione delle strategie

Teoria dei giochi: Propagazione delle strategie

The chosen one: .NET 5

The chosen one: .NET 5

Network Science e Social Network Analysis

Network Science e Social Network Analysis

Isolation levels on SSMS

Isolation levels on SSMS

Teoria dei Grafi

Teoria dei Grafi

Creare un podcast in automatico a partire da audio vocali e musica

Creare un podcast in automatico a partire da audio vocali e musica

Teoria dei Giochi

Teoria dei Giochi

Recommender systems: principali metodologie degli algoritmi di suggerimento

Recommender systems: principali metodologie degli algoritmi di suggerimento

Introduction to Quantum Computing and Qiskit

Introduction to Quantum Computing and Qiskit

System Versioned Tables

System Versioned Tables

Vim o non Vim

Vim o non Vim

I vantaggi di un Message Broker

I vantaggi di un Message Broker

PlayStation 5 e l'accesso ai dati: un cambio architetturale?

PlayStation 5 e l'accesso ai dati: un cambio architetturale?

Protezione dei Web Services

Protezione dei Web Services

need more info?

contattaci