<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Dotnet | The .NET Blog</title><link>https://thedotnetblog.com/it/tags/dotnet/</link><description>Articles, tutorials and insights from the .NET community.</description><generator>Hugo</generator><language>it</language><managingEditor>@thedotnetblog (The .NET Blog)</managingEditor><webMaster>@thedotnetblog</webMaster><lastBuildDate>Mon, 11 May 2026 00:00:00 +0000</lastBuildDate><atom:link href="https://thedotnetblog.com/it/tags/dotnet/index.xml" rel="self" type="application/rss+xml"/><item><title>SDD Conference 2026</title><link>https://thedotnetblog.com/it/events/sdd-conference-2026/</link><pubDate>Mon, 11 May 2026 00:00:00 +0000</pubDate><guid>https://thedotnetblog.com/it/events/sdd-conference-2026/</guid><description>Una conferenza di 5 giorni sullo sviluppo software al Barbican Centre di Londra con 78 sessioni e 14 workshop su architettura, .NET, IA, Azure, DevOps e altro.</description><content:encoded>&lt;p&gt;&lt;strong&gt;SDD 2026&lt;/strong&gt; si svolge dall&amp;rsquo;&lt;strong&gt;11 al 15 maggio 2026&lt;/strong&gt; al &lt;strong&gt;Barbican Centre di Londra&lt;/strong&gt;. La conferenza principale di 3 giorni va da martedì a giovedì, con workshop opzionali di un&amp;rsquo;intera giornata il lunedì e il venerdì.&lt;/p&gt;
&lt;p&gt;Con &lt;strong&gt;78 sessioni&lt;/strong&gt; e &lt;strong&gt;14 workshop&lt;/strong&gt;, è una delle conferenze per sviluppatori più ricche d&amp;rsquo;Europa.&lt;/p&gt;
&lt;h2 id="argomenti"&gt;Argomenti&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Pensiero Architetturale&lt;/li&gt;
&lt;li&gt;Codice Funzionale in C# 13&lt;/li&gt;
&lt;li&gt;Design Serverless&lt;/li&gt;
&lt;li&gt;IA Semantica&lt;/li&gt;
&lt;li&gt;Azure Kubernetes Services&lt;/li&gt;
&lt;li&gt;Strategie Lean DevOps&lt;/li&gt;
&lt;li&gt;The Model Context Protocol (MCP)&lt;/li&gt;
&lt;li&gt;IA Agentica in .NET&lt;/li&gt;
&lt;li&gt;Refactoring del Monolite&lt;/li&gt;
&lt;li&gt;Programmare Più Velocemente con gli LLM&lt;/li&gt;
&lt;li&gt;Crittografia in un Mondo Post-Quantistico&lt;/li&gt;
&lt;li&gt;Sviluppo Local First&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="speaker"&gt;Speaker&lt;/h2&gt;
&lt;p&gt;Lineup di classe mondiale che include &lt;strong&gt;Kevlin Henney&lt;/strong&gt;, &lt;strong&gt;Neal Ford&lt;/strong&gt;, &lt;strong&gt;Sander Hoogendoorn&lt;/strong&gt;, &lt;strong&gt;Andrew Clymer&lt;/strong&gt;, &lt;strong&gt;Jacqui Read&lt;/strong&gt;, &lt;strong&gt;Christian Weyer&lt;/strong&gt;, &lt;strong&gt;Jeff Prosise&lt;/strong&gt;, &lt;strong&gt;Jules May&lt;/strong&gt;, &lt;strong&gt;Oliver Sturm&lt;/strong&gt; e &lt;strong&gt;Raju Gandhi&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id="biglietti-e-informazioni"&gt;Biglietti e informazioni&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://sddconf.com/"&gt;Sito dell&amp;rsquo;evento&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://sddvault.s3.amazonaws.com/assets/SDD_2026_schedule.pdf"&gt;PDF dell&amp;rsquo;agenda completa&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://sddconf.com/register"&gt;Opzioni di registrazione&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Il 98% dei partecipanti di SDD 2025 ha valutato l&amp;rsquo;esperienza complessiva come buona, molto buona o eccellente.&lt;/p&gt;</content:encoded></item><item><title>Hook azd in Python, TypeScript e .NET: basta script shell</title><link>https://thedotnetblog.com/it/news/emiliano-montesdeoca/azd-hooks-python-javascript-typescript-dotnet/</link><pubDate>Thu, 23 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/it/news/emiliano-montesdeoca/azd-hooks-python-javascript-typescript-dotnet/</guid><description>La CLI di Azure Developer ora supporta hook in Python, JavaScript, TypeScript e .NET. Niente più switch di contesto verso Bash solo per uno script di migrazione.</description><content:encoded>&lt;p&gt;&lt;em&gt;Questo articolo è stato tradotto automaticamente. Per la versione originale, &lt;a href="https://thedotnetblog.com/it/news/emiliano-montesdeoca/azd-hooks-python-javascript-typescript-dotnet/"&gt;clicca qui&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Se hai mai avuto un progetto completamente in .NET e ti sei ritrovato a scrivere script Bash solo per gli hook di azd, conosci bene quella sensazione. Perché passare alla sintassi shell per un passaggio di pre-provisioning quando tutto il resto del progetto è in C#?&lt;/p&gt;
&lt;p&gt;Quella frustrazione ha ora una soluzione ufficiale. La CLI di Azure Developer &lt;a href="https://devblogs.microsoft.com/azure-sdk/azd-multi-language-hooks/"&gt;ha appena introdotto il supporto multi-linguaggio per gli hook&lt;/a&gt;, ed è esattamente buono come sembra.&lt;/p&gt;
&lt;h2 id="gli-hook-in-breve"&gt;Gli hook, in breve&lt;/h2&gt;
&lt;p&gt;Gli hook sono script eseguiti in punti chiave del ciclo di vita di &lt;code&gt;azd&lt;/code&gt; — prima del provisioning, dopo il deployment, e altro ancora. Definiti in &lt;code&gt;azure.yaml&lt;/code&gt;, permettono di iniettare logica personalizzata senza modificare la CLI.&lt;/p&gt;
&lt;p&gt;Prima erano supportati solo Bash e PowerShell. Ora si può usare &lt;strong&gt;Python, JavaScript, TypeScript o .NET&lt;/strong&gt; — e &lt;code&gt;azd&lt;/code&gt; si occupa del resto automaticamente.&lt;/p&gt;
&lt;h2 id="come-funziona-il-rilevamento"&gt;Come funziona il rilevamento&lt;/h2&gt;
&lt;p&gt;Basta puntare l&amp;rsquo;hook verso un file e &lt;code&gt;azd&lt;/code&gt; deduce il linguaggio dall&amp;rsquo;estensione:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;hooks&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;preprovision&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;run&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;./hooks/setup.py&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;postdeploy&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;run&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;./hooks/seed.ts&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;postprovision&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;run&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;./hooks/migrate.cs&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Nessuna configurazione aggiuntiva. Se l&amp;rsquo;estensione è ambigua, si può aggiungere &lt;code&gt;kind: python&lt;/code&gt; (o il linguaggio appropriato) per specificarlo esplicitamente.&lt;/p&gt;
&lt;h2 id="dettagli-per-linguaggio"&gt;Dettagli per linguaggio&lt;/h2&gt;
&lt;h3 id="python"&gt;Python&lt;/h3&gt;
&lt;p&gt;Inserire un &lt;code&gt;requirements.txt&lt;/code&gt; o &lt;code&gt;pyproject.toml&lt;/code&gt; vicino allo script (o in una directory padre). &lt;code&gt;azd&lt;/code&gt; crea automaticamente un ambiente virtuale, installa le dipendenze ed esegue lo script.&lt;/p&gt;
&lt;h3 id="javascript-e-typescript"&gt;JavaScript e TypeScript&lt;/h3&gt;
&lt;p&gt;Stesso schema — un &lt;code&gt;package.json&lt;/code&gt; vicino allo script e &lt;code&gt;azd&lt;/code&gt; esegue prima &lt;code&gt;npm install&lt;/code&gt;. Per TypeScript, usa &lt;code&gt;npx tsx&lt;/code&gt; senza step di compilazione né &lt;code&gt;tsconfig.json&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id="net"&gt;.NET&lt;/h3&gt;
&lt;p&gt;Due modalità disponibili:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Modalità progetto&lt;/strong&gt;: Se c&amp;rsquo;è un &lt;code&gt;.csproj&lt;/code&gt; vicino allo script, &lt;code&gt;azd&lt;/code&gt; esegue automaticamente &lt;code&gt;dotnet restore&lt;/code&gt; e &lt;code&gt;dotnet build&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Modalità single-file&lt;/strong&gt;: Con .NET 10+, i file &lt;code&gt;.cs&lt;/code&gt; autonomi vengono eseguiti direttamente via &lt;code&gt;dotnet run script.cs&lt;/code&gt;. Nessun file di progetto richiesto.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="configurazione-per-executor"&gt;Configurazione per executor&lt;/h2&gt;
&lt;p&gt;Ogni linguaggio supporta un blocco &lt;code&gt;config&lt;/code&gt; opzionale:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-yaml" data-lang="yaml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;hooks&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;preprovision&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;run&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;./hooks/setup.ts&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;config&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;packageManager&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;pnpm&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;postprovision&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;run&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;./hooks/migrate.cs&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;config&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;configuration&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;Release&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="nt"&gt;framework&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="l"&gt;net10.0&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="perché-è-importante-per-gli-sviluppatori-net"&gt;Perché è importante per gli sviluppatori .NET&lt;/h2&gt;
&lt;p&gt;Gli hook erano l&amp;rsquo;ultimo posto in un progetto basato su azd che costringeva a cambiare linguaggio. Ora l&amp;rsquo;intera pipeline di deployment può vivere in un unico linguaggio. È possibile riutilizzare le utility .NET esistenti negli hook, referenziare librerie condivise ed eliminare la manutenzione di script shell.&lt;/p&gt;
&lt;h2 id="conclusione"&gt;Conclusione&lt;/h2&gt;
&lt;p&gt;Uno di quei cambiamenti che sembrano piccoli ma che riducono concretamente la frizione quotidiana con azd. Il supporto multi-linguaggio per gli hook è disponibile ora — tutti i dettagli nel &lt;a href="https://devblogs.microsoft.com/azure-sdk/azd-multi-language-hooks/"&gt;post ufficiale&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title>Windows App Dev CLI v0.3: F5 dal terminale e UI Automation per gli agenti</title><link>https://thedotnetblog.com/it/news/emiliano-montesdeoca/windows-app-dev-cli-v03-run-ui-automation/</link><pubDate>Thu, 23 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/it/news/emiliano-montesdeoca/windows-app-dev-cli-v03-run-ui-automation/</guid><description>Windows App Development CLI v0.3 porta winapp run per avviare e fare debug dal terminale, winapp ui per l'automazione dell'interfaccia e un nuovo pacchetto NuGet che fa funzionare dotnet run con le app pacchettizzate.</description><content:encoded>&lt;p&gt;&lt;em&gt;Questo articolo è stato tradotto automaticamente. Per la versione originale, &lt;a href="https://thedotnetblog.com/it/news/emiliano-montesdeoca/windows-app-dev-cli-v03-run-ui-automation/"&gt;clicca qui&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;L&amp;rsquo;esperienza F5 di Visual Studio è fantastica. Ma dover aprire VS solo per avviare e fare debug di un&amp;rsquo;app Windows pacchettizzata è eccessivo — che si tratti di una pipeline CI, di un workflow automatizzato o di un agente AI che esegue i test.&lt;/p&gt;
&lt;p&gt;Windows App Development CLI v0.3 è &lt;a href="https://devblogs.microsoft.com/ifdef-windows/windows-app-development-cli-v0-3-new-run-and-ui-commands-plus-dotnet-run-support-for-packaged-apps/"&gt;appena uscita&lt;/a&gt; e lo affronta direttamente con due funzionalità principali: &lt;code&gt;winapp run&lt;/code&gt; e &lt;code&gt;winapp ui&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="winapp-run-f5-da-qualsiasi-posto"&gt;winapp run: F5 da qualsiasi posto&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;winapp run&lt;/code&gt; prende una cartella di app non pacchettizzata e un manifesto, e fa tutto ciò che VS fa nel debug launch: registra un pacchetto loose, avvia l&amp;rsquo;app e preserva il &lt;code&gt;LocalState&lt;/code&gt; tra i re-deploy.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Compila l&amp;#39;app, poi avviala come app pacchettizzata&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;winapp run ./bin/Debug
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Funziona per WinUI, WPF, WinForms, Console, Avalonia e altro. Le modalità sono pensate per sviluppatori e workflow automatizzati:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;--detach&lt;/code&gt;&lt;/strong&gt;: Avvia e restituisce il controllo al terminale immediatamente. Perfetto per CI.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;--unregister-on-exit&lt;/code&gt;&lt;/strong&gt;: Pulisce il pacchetto registrato alla chiusura dell&amp;rsquo;app.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;--debug-output&lt;/code&gt;&lt;/strong&gt;: Cattura i messaggi &lt;code&gt;OutputDebugString&lt;/code&gt; e le eccezioni in tempo reale.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="nuovo-pacchetto-nuget-dotnet-run-per-le-app-pacchettizzate"&gt;Nuovo pacchetto NuGet: dotnet run per le app pacchettizzate&lt;/h2&gt;
&lt;p&gt;Per gli sviluppatori .NET c&amp;rsquo;è un nuovo pacchetto NuGet: &lt;code&gt;Microsoft.Windows.SDK.BuildTools.WinApp&lt;/code&gt;. Dopo l&amp;rsquo;installazione, &lt;code&gt;dotnet run&lt;/code&gt; gestisce tutto l&amp;rsquo;inner loop: build, preparare un pacchetto loose-layout, registrare su Windows e avviare — tutto in un unico step.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;winapp init
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# o&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dotnet add package Microsoft.Windows.SDK.BuildTools.WinApp
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="winapp-ui-ui-automation-dalla-riga-di-comando"&gt;winapp ui: UI Automation dalla riga di comando&lt;/h2&gt;
&lt;p&gt;Questa è la funzionalità che apre gli scenari agentici. &lt;code&gt;winapp ui&lt;/code&gt; fornisce accesso completo UI Automation a qualsiasi app Windows in esecuzione — WPF, WinForms, Win32, Electron, WinUI3 — direttamente dal terminale.&lt;/p&gt;
&lt;p&gt;Cosa si può fare:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Elencare tutte le finestre di primo livello&lt;/li&gt;
&lt;li&gt;Navigare l&amp;rsquo;albero completo di UI Automation di una finestra&lt;/li&gt;
&lt;li&gt;Cercare elementi per nome, tipo o ID di automazione&lt;/li&gt;
&lt;li&gt;Cliccare, invocare e impostare valori&lt;/li&gt;
&lt;li&gt;Fare screenshot&lt;/li&gt;
&lt;li&gt;Attendere la comparsa di elementi — ideale per la sincronizzazione dei test&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Combinare &lt;code&gt;winapp ui&lt;/code&gt; con &lt;code&gt;winapp run&lt;/code&gt; crea un workflow completo build → avvio → verifica dal terminale. Un agente può eseguire l&amp;rsquo;app, ispezionare lo stato dell&amp;rsquo;UI e validare il risultato.&lt;/p&gt;
&lt;h2 id="altre-novità"&gt;Altre novità&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;winapp unregister&lt;/code&gt;&lt;/strong&gt;: Rimuove un pacchetto sideloaded quando si è finito.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;winapp manifest add-alias&lt;/code&gt;&lt;/strong&gt;: Aggiunge un alias per avviare l&amp;rsquo;app per nome dal terminale.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Tab completion&lt;/strong&gt;: Configura il completamento PowerShell con un singolo comando.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="come-ottenerlo"&gt;Come ottenerlo&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;winget install Microsoft.WinAppCli
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# o&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;npm install -g @microsoft/winappcli
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;La CLI è in preview pubblica. Il &lt;a href="https://github.com/microsoft/WinAppCli"&gt;repository su GitHub&lt;/a&gt; ha la documentazione completa e l&amp;rsquo;&lt;a href="https://devblogs.microsoft.com/ifdef-windows/windows-app-development-cli-v0-3-new-run-and-ui-commands-plus-dotnet-run-support-for-packaged-apps/"&gt;annuncio originale&lt;/a&gt; ha tutti i dettagli.&lt;/p&gt;</content:encoded></item><item><title>Smetti di sorvegliare il tuo terminale: la modalità detached di Aspire cambia il flusso di lavoro</title><link>https://thedotnetblog.com/it/news/emiliano-montesdeoca/aspire-detached-mode-free-your-terminal/</link><pubDate>Fri, 17 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/it/news/emiliano-montesdeoca/aspire-detached-mode-free-your-terminal/</guid><description>Aspire 13.2 ti permette di eseguire il tuo AppHost in background e riprenderti il terminale. Combinato con i nuovi comandi CLI e il supporto per gli agenti, è più importante di quanto sembri.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Questo post è stato tradotto automaticamente. Per la versione originale, &lt;a href="https://thedotnetblog.com/it/news/emiliano-montesdeoca/aspire-detached-mode-free-your-terminal/"&gt;clicca qui&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Ogni volta che esegui un AppHost di Aspire, il tuo terminale sparisce. Bloccato. Occupato finché non premi Ctrl+C. Devi eseguire un comando veloce? Apri un&amp;rsquo;altra scheda. Vuoi controllare i log? Un&amp;rsquo;altra scheda. È una piccola frizione che si accumula in fretta.&lt;/p&gt;
&lt;p&gt;Aspire 13.2 risolve questo problema. James Newton-King &lt;a href="https://devblogs.microsoft.com/aspire/aspire-detached-mode-and-process-management/"&gt;ha scritto tutti i dettagli&lt;/a&gt;, e onestamente, questa è una di quelle funzionalità che cambia immediatamente il modo in cui lavori.&lt;/p&gt;
&lt;h2 id="modalità-detached-un-comando-terminale-recuperato"&gt;Modalità detached: un comando, terminale recuperato&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aspire start
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Questa è la scorciatoia per &lt;code&gt;aspire run --detach&lt;/code&gt;. Il tuo AppHost si avvia in background e riottieni il terminale immediatamente. Niente schede extra. Niente multiplexer di terminale. Solo il tuo prompt, pronto all&amp;rsquo;uso.&lt;/p&gt;
&lt;h2 id="gestire-ciò-che-è-in-esecuzione"&gt;Gestire ciò che è in esecuzione&lt;/h2&gt;
&lt;p&gt;Il punto è questo — eseguire in background è utile solo se riesci a gestire ciò che c&amp;rsquo;è là fuori. Aspire 13.2 include un set completo di comandi CLI proprio per questo:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# List all running AppHosts&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aspire ps
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Inspect the state of a specific AppHost&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aspire describe
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Stream logs from a running AppHost&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aspire logs
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Stop a specific AppHost&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aspire stop
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Questo trasforma il CLI di Aspire in un vero gestore di processi. Puoi avviare più AppHost, controllare il loro stato, seguire i loro log e spegnerli — tutto da un&amp;rsquo;unica sessione di terminale.&lt;/p&gt;
&lt;h2 id="combinalo-con-la-modalità-isolata"&gt;Combinalo con la modalità isolata&lt;/h2&gt;
&lt;p&gt;La modalità detached si abbina naturalmente con la modalità isolata. Vuoi eseguire due istanze dello stesso progetto in background senza conflitti di porta?&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aspire start --isolated
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aspire start --isolated
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ognuna ottiene porte casuali, secret separati e il proprio ciclo di vita. Usa &lt;code&gt;aspire ps&lt;/code&gt; per vedere entrambe, &lt;code&gt;aspire stop&lt;/code&gt; per fermare quella di cui non hai più bisogno.&lt;/p&gt;
&lt;h2 id="perché-questo-è-enorme-per-gli-agenti-di-codice"&gt;Perché questo è enorme per gli agenti di codice&lt;/h2&gt;
&lt;p&gt;Qui diventa davvero interessante. Un agente di codice che lavora nel tuo terminale ora può:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Avviare l&amp;rsquo;app con &lt;code&gt;aspire start&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Interrogare il suo stato con &lt;code&gt;aspire describe&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Controllare i log con &lt;code&gt;aspire logs&lt;/code&gt; per diagnosticare problemi&lt;/li&gt;
&lt;li&gt;Fermarla con &lt;code&gt;aspire stop&lt;/code&gt; quando ha finito&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Tutto senza perdere la sessione del terminale. Prima della modalità detached, un agente che eseguiva il tuo AppHost si bloccava nel proprio terminale. Ora può avviare, osservare, iterare e ripulire — esattamente come vorresti che funzionasse un agente autonomo.&lt;/p&gt;
&lt;p&gt;Il team di Aspire ha puntato su questo. Eseguire &lt;code&gt;aspire agent init&lt;/code&gt; configura un file di skill di Aspire che insegna questi comandi agli agenti. Così strumenti come l&amp;rsquo;agente di codice di Copilot possono gestire i tuoi workload Aspire direttamente.&lt;/p&gt;
&lt;h2 id="per-concludere"&gt;Per concludere&lt;/h2&gt;
&lt;p&gt;La modalità detached è un upgrade del flusso di lavoro mascherato da semplice flag. Smetti di cambiare contesto tra i terminali, gli agenti smettono di bloccarsi da soli, e i nuovi comandi CLI ti danno visibilità reale su ciò che è in esecuzione. È pratico, è pulito, e rende il ciclo di sviluppo quotidiano notevolmente più fluido.&lt;/p&gt;
&lt;p&gt;Leggi il &lt;a href="https://devblogs.microsoft.com/aspire/aspire-detached-mode-and-process-management/"&gt;post completo&lt;/a&gt; per tutti i dettagli e scarica Aspire 13.2 con &lt;code&gt;aspire update --self&lt;/code&gt;.&lt;/p&gt;</content:encoded></item><item><title>Il Pin Clustering Arriva Finalmente in .NET MAUI Maps — Una Proprietà, Zero Problemi</title><link>https://thedotnetblog.com/it/news/emiliano-montesdeoca/maui-maps-pin-clustering-finally/</link><pubDate>Thu, 16 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/it/news/emiliano-montesdeoca/maui-maps-pin-clustering-finally/</guid><description>.NET MAUI 11 Preview 3 aggiunge il clustering nativo dei pin al controllo Map. Una proprietà, gruppi di clustering separati e gestione dei tap — tutto integrato.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Questo articolo è stato tradotto automaticamente. Per la versione originale, &lt;a href="https://thedotnetblog.com/it/news/emiliano-montesdeoca/maui-maps-pin-clustering-finally/"&gt;clicca qui&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Conosci quel momento in cui carichi una mappa con un centinaio di pin e tutto diventa una macchia illeggibile? Sì, questa è stata l&amp;rsquo;esperienza con .NET MAUI Maps fino ad ora. Non più.&lt;/p&gt;
&lt;p&gt;David Ortinau &lt;a href="https://devblogs.microsoft.com/dotnet/pin-clustering-in-dotnet-maui-maps/"&gt;ha appena annunciato&lt;/a&gt; che .NET MAUI 11 Preview 3 include il pin clustering out of the box su Android e iOS/Mac Catalyst. E la parte migliore — è ridicolmente semplice da attivare.&lt;/p&gt;
&lt;h2 id="una-proprietà-per-dominarli-tutti"&gt;Una proprietà per dominarli tutti&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nt"&gt;&amp;lt;maps:Map&lt;/span&gt; &lt;span class="na"&gt;IsClusteringEnabled=&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;True&amp;#34;&lt;/span&gt; &lt;span class="nt"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Tutto qui. I pin vicini vengono raggruppati in cluster con un badge di conteggio. Zoom in e si espandono. Zoom out e si raggruppano. Il tipo di comportamento che gli utenti si aspettano da qualsiasi mappa moderna — e ora lo ottieni con una singola proprietà.&lt;/p&gt;
&lt;h2 id="gruppi-di-clustering-indipendenti"&gt;Gruppi di clustering indipendenti&lt;/h2&gt;
&lt;p&gt;Ecco dove diventa interessante. Non tutti i pin dovrebbero raggrupparsi insieme. Le caffetterie e i parchi sono cose diverse, e la tua mappa dovrebbe saperlo.&lt;/p&gt;
&lt;p&gt;La proprietà &lt;code&gt;ClusteringIdentifier&lt;/code&gt; ti permette di separare i pin in gruppi indipendenti:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Pins&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Pin&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Label&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;Pike Place Coffee&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Location&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Location&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;47.6097&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="m"&gt;122.3331&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ClusteringIdentifier&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;coffee&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Pins&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Add&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Pin&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Label&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;Occidental Square&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Location&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Location&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;47.6064&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;-&lt;/span&gt;&lt;span class="m"&gt;122.3325&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ClusteringIdentifier&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;parks&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;});&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I pin con lo stesso identificatore si raggruppano insieme. Identificatori diversi formano cluster indipendenti anche quando sono geograficamente vicini. Nessun identificatore? Gruppo predefinito. Pulito e prevedibile.&lt;/p&gt;
&lt;h2 id="gestione-dei-tap-sui-cluster"&gt;Gestione dei tap sui cluster&lt;/h2&gt;
&lt;p&gt;Quando un utente tocca un cluster, ricevi un evento &lt;code&gt;ClusterClicked&lt;/code&gt; con tutto ciò di cui hai bisogno:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;map&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ClusterClicked&lt;/span&gt; &lt;span class="p"&gt;+=&lt;/span&gt; &lt;span class="kd"&gt;async&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sender&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;names&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;\n&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;e&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Pins&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Select&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;p&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;p&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Label&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;DisplayAlert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s"&gt;$&amp;#34;Cluster ({e.Pins.Count} pins)&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;names&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s"&gt;&amp;#34;OK&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// Suppress default zoom-to-cluster behavior:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="c1"&gt;// e.Handled = true;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Gli argomenti dell&amp;rsquo;evento ti danno &lt;code&gt;Pins&lt;/code&gt; (i pin nel cluster), &lt;code&gt;Location&lt;/code&gt; (il centro geografico) e &lt;code&gt;Handled&lt;/code&gt; (impostalo su &lt;code&gt;true&lt;/code&gt; se vuoi sovrascrivere lo zoom predefinito). Semplice, pratico, esattamente quello che ti aspetteresti.&lt;/p&gt;
&lt;h2 id="dettagli-di-piattaforma-da-conoscere"&gt;Dettagli di piattaforma da conoscere&lt;/h2&gt;
&lt;p&gt;Su Android, il clustering usa un algoritmo personalizzato basato su griglia che ricalcola ai cambi di zoom — nessuna dipendenza esterna. Su iOS e Mac Catalyst, sfrutta il supporto nativo di &lt;code&gt;MKClusterAnnotation&lt;/code&gt; di MapKit, il che significa animazioni fluide e native della piattaforma.&lt;/p&gt;
&lt;p&gt;Questo è uno di quei casi in cui il team MAUI ha fatto la scelta giusta — appoggiarsi alla piattaforma dove ha senso.&lt;/p&gt;
&lt;h2 id="perché-è-importante"&gt;Perché è importante&lt;/h2&gt;
&lt;p&gt;Il pin clustering è stata una delle funzionalità più richieste in .NET MAUI (&lt;a href="https://github.com/dotnet/maui/issues/11811"&gt;issue #11811&lt;/a&gt;), e a buon ragione. Ogni app che mostra posizioni su una mappa — tracciamento consegne, localizzatori di negozi, immobiliare — ne ha bisogno. Prima dovevi costruirlo da solo o integrare una libreria di terze parti. Ora è integrato.&lt;/p&gt;
&lt;p&gt;Per noi sviluppatori .NET che costruiamo app mobile multipiattaforma, questo è il tipo di miglioramento della qualità della vita che rende MAUI una scelta genuinamente pratica per scenari con uso intensivo di mappe.&lt;/p&gt;
&lt;h2 id="per-iniziare"&gt;Per iniziare&lt;/h2&gt;
&lt;p&gt;Installa &lt;a href="https://dotnet.microsoft.com/download/dotnet/11.0"&gt;.NET 11 Preview 3&lt;/a&gt; e aggiorna il workload .NET MAUI. L&amp;rsquo;&lt;a href="https://github.com/dotnet/maui-samples/tree/main/10.0/UserInterface/Views/Map/MapDemo/WorkingWithMaps"&gt;esempio Maps&lt;/a&gt; include una nuova pagina Clustering con cui puoi giocare subito.&lt;/p&gt;
&lt;p&gt;Vai a costruire qualcosa — e lascia che le tue mappe finalmente respirino.&lt;/p&gt;</content:encoded></item><item><title>.NET Aprile 2026 Servicing — Patch di sicurezza da applicare oggi</title><link>https://thedotnetblog.com/it/news/emiliano-montesdeoca/dotnet-april-2026-servicing-security-patches/</link><pubDate>Wed, 15 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/it/news/emiliano-montesdeoca/dotnet-april-2026-servicing-security-patches/</guid><description>L'aggiornamento di servicing di aprile 2026 corregge 6 CVE in .NET 10, .NET 9, .NET 8 e .NET Framework — incluse due vulnerabilità di esecuzione di codice remoto.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Questo post è stato tradotto automaticamente. Per la versione originale, &lt;a href="https://thedotnetblog.com/it/news/emiliano-montesdeoca/dotnet-april-2026-servicing-security-patches/"&gt;clicca qui&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Gli &lt;a href="https://devblogs.microsoft.com/dotnet/dotnet-and-dotnet-framework-april-2026-servicing-updates/"&gt;aggiornamenti di servicing di aprile 2026&lt;/a&gt; per .NET e .NET Framework sono disponibili, e questo include correzioni di sicurezza che vorrai applicare presto. Sei CVE corrette, incluse due vulnerabilità di esecuzione di codice remoto (RCE).&lt;/p&gt;
&lt;h2 id="cosa-è-stato-corretto"&gt;Cosa è stato corretto&lt;/h2&gt;
&lt;p&gt;Ecco il riepilogo rapido:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;CVE&lt;/th&gt;
&lt;th&gt;Tipo&lt;/th&gt;
&lt;th&gt;Interessa&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;CVE-2026-26171&lt;/td&gt;
&lt;td&gt;Bypass delle funzionalità di sicurezza&lt;/td&gt;
&lt;td&gt;.NET 10, 9, 8 + .NET Framework&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CVE-2026-32178&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Esecuzione di codice remoto&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;.NET 10, 9, 8 + .NET Framework&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CVE-2026-33116&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;Esecuzione di codice remoto&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;.NET 10, 9, 8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CVE-2026-32203&lt;/td&gt;
&lt;td&gt;Denial of Service&lt;/td&gt;
&lt;td&gt;.NET 10, 9, 8 + .NET Framework&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CVE-2026-23666&lt;/td&gt;
&lt;td&gt;Denial of Service&lt;/td&gt;
&lt;td&gt;.NET Framework 3.0–4.8.1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;CVE-2026-32226&lt;/td&gt;
&lt;td&gt;Denial of Service&lt;/td&gt;
&lt;td&gt;.NET Framework 2.0–4.8.1&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Le due CVE RCE (CVE-2026-32178 e CVE-2026-33116) interessano la gamma più ampia di versioni .NET e dovrebbero essere la priorità.&lt;/p&gt;
&lt;h2 id="versioni-aggiornate"&gt;Versioni aggiornate&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;.NET 10&lt;/strong&gt;: 10.0.6&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;.NET 9&lt;/strong&gt;: 9.0.15&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;.NET 8&lt;/strong&gt;: 8.0.26&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Tutte sono disponibili attraverso i canali abituali — &lt;a href="https://dotnet.microsoft.com/download/dotnet/10.0"&gt;dotnet.microsoft.com&lt;/a&gt;, immagini container su MCR e gestori di pacchetti Linux.&lt;/p&gt;
&lt;h2 id="cosa-fare"&gt;Cosa fare&lt;/h2&gt;
&lt;p&gt;Aggiorna i tuoi progetti e le pipeline CI/CD alle ultime versioni con patch. Se stai usando container, scarica le immagini più recenti. Se sei su .NET Framework, controlla le &lt;a href="https://learn.microsoft.com/dotnet/framework/release-notes/release-notes"&gt;note di rilascio di .NET Framework&lt;/a&gt; per le patch corrispondenti.&lt;/p&gt;
&lt;p&gt;Per chi sta eseguendo .NET 10 in produzione (è la versione corrente), 10.0.6 è un aggiornamento obbligatorio. Lo stesso vale per .NET 9.0.15 e .NET 8.0.26 se sei su quelle versioni LTS. Due vulnerabilità RCE non sono qualcosa che si rimanda.&lt;/p&gt;</content:encoded></item><item><title>Azure MCP Server 2.0 è Arrivato — L'Automazione Agentica Self-Hosted nel Cloud È Qui</title><link>https://thedotnetblog.com/it/news/emiliano-montesdeoca/azure-mcp-server-2-self-hosted-agentic-cloud/</link><pubDate>Sat, 11 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/it/news/emiliano-montesdeoca/azure-mcp-server-2-self-hosted-agentic-cloud/</guid><description>Azure MCP Server 2.0 è stabile con deployment remoti self-hosted, 276 tool su 57 servizi Azure, e sicurezza di livello enterprise — ecco cosa conta per gli sviluppatori .NET che costruiscono workflow agentici.</description><content:encoded>&lt;p&gt;&lt;em&gt;Questo articolo è stato tradotto automaticamente. Per la versione originale, &lt;a href="https://thedotnetblog.com/it/news/emiliano-montesdeoca/azure-mcp-server-2-self-hosted-agentic-cloud/"&gt;clicca qui&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Se hai costruito qualcosa con MCP e Azure di recente, probabilmente sai già che l&amp;rsquo;esperienza locale funziona bene. Connetti un server MCP, lascia che il tuo agente AI parli alle risorse Azure, e vai avanti. Ma nel momento in cui hai bisogno di condividere questa configurazione con un team? Ecco dove le cose si complicavano.&lt;/p&gt;
&lt;p&gt;Non più. Azure MCP Server &lt;a href="https://devblogs.microsoft.com/azure-sdk/announcing-azure-mcp-server-2-0-stable-release/"&gt;ha appena raggiunto la versione 2.0 stabile&lt;/a&gt;, e la feature principale è esattamente quello che i team enterprise chiedevano: &lt;strong&gt;supporto per server MCP remoti self-hosted&lt;/strong&gt;.&lt;/p&gt;
&lt;h2 id="che-cosè-azure-mcp-server"&gt;Che cos&amp;rsquo;è Azure MCP Server?&lt;/h2&gt;
&lt;p&gt;Un rapido ripasso. Azure MCP Server implementa la specifica &lt;a href="https://modelcontextprotocol.io/docs/getting-started/intro"&gt;Model Context Protocol&lt;/a&gt; ed espone le capacità di Azure come tool strutturati e scopribili che gli agenti AI possono invocare. Pensalo come un ponte standardizzato tra il tuo agente e Azure — provisioning, deployment, monitoring, diagnostica, tutto attraverso un&amp;rsquo;interfaccia coerente.&lt;/p&gt;
&lt;p&gt;I numeri parlano da soli: &lt;strong&gt;276 tool MCP su 57 servizi Azure&lt;/strong&gt;. È una copertura seria.&lt;/p&gt;
&lt;h2 id="il-grande-affare-deployment-remoti-self-hosted"&gt;Il grande affare: deployment remoti self-hosted&lt;/h2&gt;
&lt;p&gt;Ecco il punto. Eseguire MCP localmente sulla tua macchina va bene per lo sviluppo e gli esperimenti. Ma in uno scenario di team reale, hai bisogno di:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Accesso condiviso per sviluppatori e sistemi agentici interni&lt;/li&gt;
&lt;li&gt;Configurazione centralizzata (contesto tenant, impostazioni di sottoscrizione predefinite, telemetria)&lt;/li&gt;
&lt;li&gt;Limiti di rete e policy aziendali&lt;/li&gt;
&lt;li&gt;Integrazione nelle pipeline CI/CD&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Azure MCP Server 2.0 affronta tutto questo. Puoi deployarlo come servizio interno gestito centralmente con trasporto basato su HTTP, autenticazione adeguata e governance coerente.&lt;/p&gt;
&lt;p&gt;Per l&amp;rsquo;autenticazione, hai due solide opzioni:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Managed Identity&lt;/strong&gt; — quando eseguito insieme a &lt;a href="https://aka.ms/azmcp/self-host/foundry"&gt;Microsoft Foundry&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;On-Behalf-Of (OBO) flow&lt;/strong&gt; — delegazione OpenID Connect che chiama le API Azure usando il contesto dell&amp;rsquo;utente autenticato&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Quel flusso OBO è particolarmente interessante per noi sviluppatori .NET. Significa che i tuoi workflow agentici possono operare con i permessi effettivi dell&amp;rsquo;utente, non con un account di servizio sovra-privilegiato. Principio del minimo privilegio, integrato fin dall&amp;rsquo;inizio.&lt;/p&gt;
&lt;h2 id="hardening-della-sicurezza"&gt;Hardening della sicurezza&lt;/h2&gt;
&lt;p&gt;Non è solo un rilascio di feature — è anche uno di sicurezza. Il rilascio 2.0 aggiunge:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Validazione endpoint più forte&lt;/li&gt;
&lt;li&gt;Protezioni contro i pattern di injection negli strumenti orientati alle query&lt;/li&gt;
&lt;li&gt;Controlli di isolamento più rigidi per gli ambienti di sviluppo&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Se stai per esporre MCP come servizio condiviso, questi salvaguardi contano. Molto.&lt;/p&gt;
&lt;h2 id="dove-puoi-usarlo"&gt;Dove puoi usarlo?&lt;/h2&gt;
&lt;p&gt;La storia della compatibilità client è ampia. Azure MCP Server 2.0 funziona con:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;IDE&lt;/strong&gt;: VS Code, Visual Studio, IntelliJ, Eclipse, Cursor&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Agenti CLI&lt;/strong&gt;: GitHub Copilot CLI, Claude Code&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Standalone&lt;/strong&gt;: server locale per configurazioni semplici&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Self-hosted remote&lt;/strong&gt;: la nuova stella del 2.0&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Inoltre c&amp;rsquo;è il supporto per sovereign cloud per Azure US Government e Azure gestito da 21Vianet, che è critico per i deployment regolamentati.&lt;/p&gt;
&lt;h2 id="perché-questo-conta-per-gli-sviluppatori-net"&gt;Perché questo conta per gli sviluppatori .NET&lt;/h2&gt;
&lt;p&gt;Se stai costruendo applicazioni agentiche con .NET — che sia Semantic Kernel, Microsoft Agent Framework, o la tua orchestrazione personalizzata — Azure MCP Server 2.0 ti dà un modo production-ready per lasciare che i tuoi agenti interagiscano con l&amp;rsquo;infrastruttura Azure. Nessun wrapper REST personalizzato. Nessun pattern di integrazione specifico per il servizio. Solo MCP.&lt;/p&gt;
&lt;p&gt;Combinato con l&amp;rsquo;&lt;a href="https://devblogs.microsoft.com/azure-sdk/mcp-as-easy-as-1-2-3-introducing-the-fluent-api-for-mcp-apps/"&gt;API fluent per MCP Apps&lt;/a&gt; uscito pochi giorni fa, l&amp;rsquo;ecosistema .NET MCP sta maturando velocemente.&lt;/p&gt;
&lt;h2 id="per-iniziare"&gt;Per iniziare&lt;/h2&gt;
&lt;p&gt;Scegli il tuo percorso:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://aka.ms/azmcp"&gt;GitHub Repo&lt;/a&gt;&lt;/strong&gt; — codice sorgente, documentazione, tutto&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://aka.ms/azmcp/download/docker"&gt;Docker Image&lt;/a&gt;&lt;/strong&gt; — deployment containerizzato&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://aka.ms/azmcp/download/vscode"&gt;VS Code Extension&lt;/a&gt;&lt;/strong&gt; — integrazione IDE&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;&lt;a href="https://aka.ms/azmcp/self-host"&gt;Self-hosting guide&lt;/a&gt;&lt;/strong&gt; — la feature principale del 2.0&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="per-concludere"&gt;Per concludere&lt;/h2&gt;
&lt;p&gt;Azure MCP Server 2.0 è esattamente il tipo di upgrade infrastrutturale che non sembra vistoso in una demo ma cambia tutto nella pratica. MCP remoto self-hosted con autenticazione appropriata, hardening della sicurezza e supporto per sovereign cloud significa che MCP è pronto per team reali che costruiscono workflow agentici reali su Azure. Se stavi aspettando il segnale &amp;ldquo;enterprise-ready&amp;rdquo; — questo è.&lt;/p&gt;</content:encoded></item><item><title>.NET Aspire 13.2 Vuole Essere il Migliore Amico del Tuo Agente IA</title><link>https://thedotnetblog.com/it/news/emiliano-montesdeoca/aspire-agentic-development-build-run-observe/</link><pubDate>Fri, 10 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/it/news/emiliano-montesdeoca/aspire-agentic-development-build-run-observe/</guid><description>Aspire 13.2 punta tutto sullo sviluppo agentico — output CLI strutturato, esecuzioni isolate, ambienti auto-riparanti e dati OpenTelemetry completi perché i tuoi agenti IA possano davvero costruire, eseguire e osservare le tue app.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Questo post è stato tradotto automaticamente. Per la versione originale, &lt;a href="https://thedotnetblog.com/it/news/emiliano-montesdeoca/aspire-agentic-development-build-run-observe/"&gt;clicca qui&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Conosci quel momento in cui il tuo agente IA scrive del codice solido, ti entusiasmi, e poi tutto crolla quando prova a &lt;em&gt;eseguire&lt;/em&gt; la cosa? Conflitti di porte, processi fantasma, variabili d&amp;rsquo;ambiente sbagliate — improvvisamente il tuo agente sta bruciando token per risolvere problemi di avvio invece di costruire funzionalità.&lt;/p&gt;
&lt;p&gt;Il team di Aspire ha appena pubblicato un &lt;a href="https://devblogs.microsoft.com/aspire/agentic-dev-aspirations/"&gt;post molto ben pensato&lt;/a&gt; su esattamente questo problema, e la loro risposta è convincente: Aspire 13.2 è progettato non solo per gli umani, ma per gli agenti IA.&lt;/p&gt;
&lt;h2 id="il-problema-è-reale"&gt;Il problema è reale&lt;/h2&gt;
&lt;p&gt;Gli agenti IA sono incredibili nello scrivere codice. Ma consegnare un&amp;rsquo;app full-stack funzionante richiede molto di più che generare file. Devi avviare i servizi nell&amp;rsquo;ordine giusto, gestire le porte, impostare le variabili d&amp;rsquo;ambiente, connettere i database e ottenere feedback quando qualcosa si rompe. Al momento, la maggior parte degli agenti gestisce tutto questo per tentativi — eseguendo comandi, leggendo output di errore, riprovando.&lt;/p&gt;
&lt;p&gt;Aggiungiamo istruzioni Markdown, skill personalizzati e prompt per guidarli, ma sono imprevedibili, non possono essere compilati e costano token solo per essere parsati. Il team di Aspire ha centrato l&amp;rsquo;insight chiave: gli agenti hanno bisogno di &lt;strong&gt;compilatori e API strutturate&lt;/strong&gt;, non di più Markdown.&lt;/p&gt;
&lt;h2 id="aspire-come-infrastruttura-per-agenti"&gt;Aspire come infrastruttura per agenti&lt;/h2&gt;
&lt;p&gt;Ecco cosa porta Aspire 13.2 al tavolo dello sviluppo agentico:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Tutto il tuo stack in codice tipizzato.&lt;/strong&gt; L&amp;rsquo;AppHost definisce la tua topologia completa — API, frontend, database, cache — in TypeScript o C# compilabile:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-typescript" data-lang="typescript"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;import&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;createBuilder&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="kr"&gt;from&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;./.modules/aspire.js&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;builder&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;createBuilder&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;postgres&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;addPostgres&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;pg&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;addDatabase&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;catalog&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;cache&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;addRedis&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;cache&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kr"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;api&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;builder&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;addNodeApp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;api&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;./api&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;src/index.ts&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;withHttpEndpoint&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="nx"&gt;env&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;PORT&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;})&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;withReference&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;postgres&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;withReference&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;cache&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;builder&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;addViteApp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;frontend&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;./frontend&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;withReference&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;api&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;waitFor&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;api&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;build&lt;/span&gt;&lt;span class="p"&gt;().&lt;/span&gt;&lt;span class="nx"&gt;run&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Un agente può leggere questo per capire la topologia dell&amp;rsquo;app, aggiungere risorse, collegare connessioni e &lt;em&gt;compilare per verificare&lt;/em&gt;. Il compilatore gli dice immediatamente se qualcosa è sbagliato. Niente congetture, niente tentativi con i file di configurazione.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Un solo comando per governarli tutti.&lt;/strong&gt; Invece di far destreggiate gli agenti tra &lt;code&gt;docker compose up&lt;/code&gt;, &lt;code&gt;npm run dev&lt;/code&gt; e script di avvio database, tutto è semplicemente &lt;code&gt;aspire start&lt;/code&gt;. Tutte le risorse si avviano nell&amp;rsquo;ordine giusto, sulle porte giuste, con la configurazione giusta. I processi a lunga durata non bloccano l&amp;rsquo;agente — Aspire li gestisce.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Modalità isolata per agenti paralleli.&lt;/strong&gt; Con &lt;code&gt;--isolated&lt;/code&gt;, ogni esecuzione di Aspire ottiene le proprie porte casuali e segreti utente separati. Hai più agenti che lavorano su git worktree? Non entreranno in collisione. Questo è enorme per strumenti come gli agenti in background di VS Code che creano ambienti paralleli.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Occhi da agente attraverso la telemetria.&lt;/strong&gt; Qui diventa davvero potente. La CLI di Aspire espone dati OpenTelemetry completi durante lo sviluppo — tracce, metriche, log strutturati. Il tuo agente non sta solo leggendo l&amp;rsquo;output della console sperando per il meglio. Può tracciare una richiesta fallita tra i servizi, profilare endpoint lenti e individuare esattamente dove le cose si rompono. Questa è osservabilità di livello produzione nel ciclo di sviluppo.&lt;/p&gt;
&lt;h2 id="lanalogia-dei-parabordi-del-bowling"&gt;L&amp;rsquo;analogia dei parabordi del bowling&lt;/h2&gt;
&lt;p&gt;Il team di Aspire usa un&amp;rsquo;ottima analogia: pensa ad Aspire come ai parabordi della pista da bowling per gli agenti IA. Se l&amp;rsquo;agente non è perfetto (e non lo sarà), i parabordi impediscono che tiri nel canale. La definizione dello stack previene la misconfigurazioni, il compilatore cattura gli errori, la CLI gestisce i processi e la telemetria fornisce il ciclo di feedback.&lt;/p&gt;
&lt;p&gt;Combina questo con qualcosa come Playwright CLI, e il tuo agente può davvero &lt;em&gt;usare&lt;/em&gt; la tua app — cliccando nei flussi, controllando il DOM, vedendo le cose rotte nella telemetria, sistemando il codice, riavviando e testando di nuovo. Costruire, eseguire, osservare, sistemare. Questo è il ciclo di sviluppo autonomo che stavamo inseguendo.&lt;/p&gt;
&lt;h2 id="per-iniziare"&gt;Per iniziare&lt;/h2&gt;
&lt;p&gt;Nuovo con Aspire? Installa la CLI da &lt;a href="https://get.aspire.dev"&gt;get.aspire.dev&lt;/a&gt; e segui la &lt;a href="https://aspire.dev/get-started/first-app"&gt;guida introduttiva&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Già usi Aspire? Esegui &lt;code&gt;aspire update --self&lt;/code&gt; per ottenere la 13.2, poi punta il tuo agente di coding preferito al tuo repo. Potresti stupirti di quanto va più lontano con i guardrail di Aspire.&lt;/p&gt;
&lt;h2 id="per-concludere"&gt;Per concludere&lt;/h2&gt;
&lt;p&gt;Aspire 13.2 non è più solo un framework per app distribuite — sta diventando infrastruttura essenziale per agenti. Definizioni di stack strutturate, avvio con un comando, esecuzioni parallele isolate e telemetria in tempo reale danno agli agenti IA esattamente ciò di cui hanno bisogno per passare dallo scrivere codice al consegnare app.&lt;/p&gt;
&lt;p&gt;Leggi il &lt;a href="https://devblogs.microsoft.com/aspire/agentic-dev-aspirations/"&gt;post completo&lt;/a&gt; dal team di Aspire per tutti i dettagli e i video dimostrativi.&lt;/p&gt;</content:encoded></item><item><title>Collega i tuoi server MCP su Azure Functions ai Foundry Agents — Ecco come</title><link>https://thedotnetblog.com/it/news/emiliano-montesdeoca/foundry-agents-mcp-servers-azure-functions/</link><pubDate>Fri, 10 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/it/news/emiliano-montesdeoca/foundry-agents-mcp-servers-azure-functions/</guid><description>Costruisci il tuo server MCP una volta, distribiscilo su Azure Functions e collegalo agli agenti Microsoft Foundry con autenticazione adeguata. I tuoi strumenti funzionano ovunque — VS Code, Cursor, e ora agenti AI aziendali.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Questo post è stato tradotto automaticamente. Per la versione originale, &lt;a href="https://thedotnetblog.com/it/news/emiliano-montesdeoca/foundry-agents-mcp-servers-azure-functions/"&gt;clicca qui&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Ecco cosa adoro dell&amp;rsquo;ecosistema MCP: costruisci il tuo server una volta e funziona ovunque. VS Code, Visual Studio, Cursor, ChatGPT — ogni client MCP può scoprire e utilizzare i tuoi strumenti. Ora, Microsoft sta aggiungendo un altro consumatore a quella lista: gli agenti Foundry.&lt;/p&gt;
&lt;p&gt;Lily Ma del team Azure SDK &lt;a href="https://devblogs.microsoft.com/azure-sdk/give-your-foundry-agent-custom-tools-with-mcp-servers-on-azure-functions/"&gt;ha pubblicato una guida pratica&lt;/a&gt; su come collegare server MCP distribuiti su Azure Functions con gli agenti Microsoft Foundry. Se hai già un server MCP, questo è puro valore aggiunto — nessuna ricostruzione necessaria.&lt;/p&gt;
&lt;h2 id="perché-questa-combinazione-ha-senso"&gt;Perché questa combinazione ha senso&lt;/h2&gt;
&lt;p&gt;Azure Functions ti offre infrastruttura scalabile, autenticazione integrata e fatturazione serverless per ospitare server MCP. Microsoft Foundry ti dà agenti AI che possono ragionare, pianificare e agire. Collegare i due significa che i tuoi strumenti personalizzati — interrogare un database, chiamare un&amp;rsquo;API aziendale, eseguire logica di validazione — diventano capacità che gli agenti AI aziendali possono scoprire e utilizzare autonomamente.&lt;/p&gt;
&lt;p&gt;Il punto chiave: il tuo server MCP resta lo stesso. Stai semplicemente aggiungendo Foundry come un altro consumatore. Gli stessi strumenti che funzionano nel tuo setup VS Code ora alimentano un agente AI con cui il tuo team o i clienti interagiscono.&lt;/p&gt;
&lt;h2 id="opzioni-di-autenticazione"&gt;Opzioni di autenticazione&lt;/h2&gt;
&lt;p&gt;È qui che il post offre davvero valore. Quattro metodi di autenticazione a seconda del tuo scenario:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metodo&lt;/th&gt;
&lt;th&gt;Caso d&amp;rsquo;uso&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Basato su chiave&lt;/strong&gt; (predefinito)&lt;/td&gt;
&lt;td&gt;Sviluppo o server senza autenticazione Entra&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Microsoft Entra&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Produzione con identità gestite&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Passthrough identità OAuth&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Produzione dove ogni utente si autentica individualmente&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Senza autenticazione&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Dev/test o solo dati pubblici&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;Per la produzione, Microsoft Entra con identità dell&amp;rsquo;agente è il percorso consigliato. Il passthrough identità OAuth è per quando il contesto utente conta — l&amp;rsquo;agente chiede agli utenti di accedere, e ogni richiesta porta il token personale dell&amp;rsquo;utente.&lt;/p&gt;
&lt;h2 id="configurazione"&gt;Configurazione&lt;/h2&gt;
&lt;p&gt;Il flusso generale:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Distribuisci il tuo server MCP su Azure Functions&lt;/strong&gt; — esempi disponibili per &lt;a href="https://github.com/Azure-Samples/remote-mcp-functions-dotnet"&gt;.NET&lt;/a&gt;, Python, TypeScript e Java&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Abilita l&amp;rsquo;autenticazione MCP integrata&lt;/strong&gt; sulla tua function app&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ottieni l&amp;rsquo;URL del tuo endpoint&lt;/strong&gt; — &lt;code&gt;https://&amp;lt;FUNCTION_APP_NAME&amp;gt;.azurewebsites.net/runtime/webhooks/mcp&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Aggiungi il server MCP come strumento in Foundry&lt;/strong&gt; — naviga al tuo agente nel portale, aggiungi un nuovo strumento MCP, fornisci endpoint e credenziali&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Poi testalo nel playground dell&amp;rsquo;Agent Builder inviando un prompt che attiverebbe uno dei tuoi strumenti.&lt;/p&gt;
&lt;h2 id="la-mia-opinione"&gt;La mia opinione&lt;/h2&gt;
&lt;p&gt;La storia della composabilità qui sta diventando davvero forte. Costruisci il tuo server MCP una volta in .NET (o Python, TypeScript, Java), distribuiscilo su Azure Functions, e ogni client compatibile con MCP può usarlo — strumenti di codifica, app di chat, e ora agenti AI aziendali. È un pattern &amp;ldquo;scrivi una volta, usa ovunque&amp;rdquo; che funziona davvero.&lt;/p&gt;
&lt;p&gt;Per gli sviluppatori .NET nello specifico, l&amp;rsquo;&lt;a href="https://github.com/Azure-Samples/remote-mcp-functions-dotnet"&gt;estensione MCP di Azure Functions&lt;/a&gt; rende tutto semplice. Definisci i tuoi strumenti come Azure Functions, fai il deploy, e hai un server MCP di livello produzione con tutta la sicurezza e la scalabilità che Azure Functions offre.&lt;/p&gt;
&lt;h2 id="conclusione"&gt;Conclusione&lt;/h2&gt;
&lt;p&gt;Se hai strumenti MCP in esecuzione su Azure Functions, collegarli agli agenti Foundry è una vittoria rapida — i tuoi strumenti personalizzati diventano capacità AI aziendali con autenticazione adeguata e senza modifiche al codice del server.&lt;/p&gt;
&lt;p&gt;Leggi la &lt;a href="https://devblogs.microsoft.com/azure-sdk/give-your-foundry-agent-custom-tools-with-mcp-servers-on-azure-functions/"&gt;guida completa&lt;/a&gt; per istruzioni passo passo su ogni metodo di autenticazione, e consulta la &lt;a href="https://learn.microsoft.com/azure/azure-functions/functions-mcp-foundry-tools?tabs=entra%2Cmcp-extension%2Cfoundry"&gt;documentazione dettagliata&lt;/a&gt; per configurazioni di produzione.&lt;/p&gt;</content:encoded></item><item><title>La Modalità Isolata di Aspire Risolve l'Incubo dei Conflitti di Porta per lo Sviluppo Parallelo</title><link>https://thedotnetblog.com/it/news/emiliano-montesdeoca/aspire-isolated-mode-parallel-instances/</link><pubDate>Fri, 10 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/it/news/emiliano-montesdeoca/aspire-isolated-mode-parallel-instances/</guid><description>Aspire 13.2 introduce la modalità --isolated: porte random, segreti separati e zero collisioni quando si eseguono più istanze dello stesso AppHost. Perfetto per agenti IA, worktree e workflow paralleli.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Questo post è stato tradotto automaticamente. Per la versione originale, &lt;a href="https://thedotnetblog.com/it/news/emiliano-montesdeoca/aspire-isolated-mode-parallel-instances/"&gt;clicca qui&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Se hai mai provato a eseguire due istanze dello stesso progetto contemporaneamente, conosci il dolore. La porta 8080 è già in uso. La porta 17370 è occupata. Uccidi qualcosa, riavvia, destreggiati tra le variabili d&amp;rsquo;ambiente — è un killer della produttività.&lt;/p&gt;
&lt;p&gt;Questo problema sta peggiorando, non migliorando. Gli agenti IA creano git worktree per lavorare in modo indipendente. Gli agenti in background avviano ambienti separati. Gli sviluppatori fanno checkout dello stesso repo due volte per i feature branch. Ognuno di questi scenari sbatte contro lo stesso muro: due istanze della stessa app che lottano per le stesse porte.&lt;/p&gt;
&lt;p&gt;Aspire 13.2 risolve questo con un singolo flag. James Newton-King del team Aspire ha &lt;a href="https://devblogs.microsoft.com/aspire/aspire-isolated-mode-parallel-development/"&gt;scritto tutti i dettagli&lt;/a&gt;, ed è una di quelle feature &amp;ldquo;perché non l&amp;rsquo;avevamo già?&amp;rdquo;&lt;/p&gt;
&lt;h2 id="la-soluzione---isolated"&gt;La soluzione: &lt;code&gt;--isolated&lt;/code&gt;&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aspire run --isolated
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Questo è tutto. Ogni esecuzione ottiene:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Porte random&lt;/strong&gt; — niente più collisioni tra istanze&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Segreti utente isolati&lt;/strong&gt; — connection string e chiavi API restano separate per istanza&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Nessuna riassegnazione manuale delle porte. Nessun giocoleria con le variabili d&amp;rsquo;ambiente. Ogni esecuzione ottiene un ambiente pulito e privo di collisioni automaticamente.&lt;/p&gt;
&lt;h2 id="scenari-reali-dove-questo-brilla"&gt;Scenari reali dove questo brilla&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Checkout multipli.&lt;/strong&gt; Hai un feature branch in una directory e un bugfix in un&amp;rsquo;altra:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Terminal 1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; ~/projects/my-app-feature
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aspire run --isolated
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;# Terminal 2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; ~/projects/my-app-bugfix
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aspire run --isolated
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Entrambi girano senza conflitti. La dashboard mostra cosa sta girando e dove.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Agenti in background in VS Code.&lt;/strong&gt; Quando l&amp;rsquo;agente in background di Copilot Chat crea un git worktree per lavorare sul tuo codice in modo indipendente, potrebbe aver bisogno di eseguire il tuo AppHost Aspire. Senza &lt;code&gt;--isolated&lt;/code&gt;, c&amp;rsquo;è un conflitto di porte con il tuo worktree principale. Con esso, entrambe le istanze funzionano e basta.&lt;/p&gt;
&lt;p&gt;Lo skill Aspire distribuito con &lt;code&gt;aspire agent init&lt;/code&gt; istruisce automaticamente gli agenti a usare &lt;code&gt;--isolated&lt;/code&gt; quando lavorano nei worktree. Quindi l&amp;rsquo;agente in background di Copilot dovrebbe gestire tutto nativamente.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Test di integrazione in parallelo allo sviluppo.&lt;/strong&gt; Hai bisogno di eseguire test contro un AppHost live mentre continui a sviluppare funzionalità? La modalità isolata dà a ogni contesto le sue porte e la sua configurazione.&lt;/p&gt;
&lt;h2 id="come-funziona-sotto-il-cofano"&gt;Come funziona sotto il cofano&lt;/h2&gt;
&lt;p&gt;Quando passi &lt;code&gt;--isolated&lt;/code&gt;, la CLI genera un ID di istanza unico per l&amp;rsquo;esecuzione. Questo guida due comportamenti:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Randomizzazione delle porte&lt;/strong&gt; — invece di legarsi a porte prevedibili definite nella configurazione del tuo AppHost, la modalità isolata sceglie porte casuali disponibili per tutto — la dashboard, gli endpoint dei servizi, tutto. Il service discovery si adatta automaticamente, così i servizi si trovano a vicenda indipendentemente da quali porte ottengono.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Isolamento dei segreti&lt;/strong&gt; — ogni esecuzione isolata ottiene il proprio store di segreti utente, identificato dall&amp;rsquo;ID dell&amp;rsquo;istanza. Connection string e chiavi API di un&amp;rsquo;esecuzione non trapelano in un&amp;rsquo;altra.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Il tuo codice non ha bisogno di modifiche. Il service discovery di Aspire risolve gli endpoint a runtime, quindi tutto si connette correttamente indipendentemente dall&amp;rsquo;assegnazione delle porte.&lt;/p&gt;
&lt;h2 id="quando-usarlo"&gt;Quando usarlo&lt;/h2&gt;
&lt;p&gt;Usa &lt;code&gt;--isolated&lt;/code&gt; quando esegui più istanze dello stesso AppHost contemporaneamente — che si tratti di sviluppo parallelo, test automatizzati, agenti IA o git worktree. Per lo sviluppo a singola istanza dove preferisci porte prevedibili, il normale &lt;code&gt;aspire run&lt;/code&gt; funziona ancora benissimo.&lt;/p&gt;
&lt;h2 id="per-concludere"&gt;Per concludere&lt;/h2&gt;
&lt;p&gt;La modalità isolata è una piccola feature che risolve un problema reale e sempre più comune. Man mano che lo sviluppo assistito da IA ci spinge verso più workflow paralleli — agenti multipli, worktree multipli, contesti multipli — la capacità di semplicemente avviare un&amp;rsquo;altra istanza senza lottare per le porte è essenziale.&lt;/p&gt;
&lt;p&gt;Leggi il &lt;a href="https://devblogs.microsoft.com/aspire/aspire-isolated-mode-parallel-development/"&gt;post completo&lt;/a&gt; per tutti i dettagli tecnici e provalo con &lt;code&gt;aspire update --self&lt;/code&gt; per ottenere la 13.2.&lt;/p&gt;</content:encoded></item><item><title>La valutazione di modernizzazione di GitHub Copilot è il miglior strumento di migrazione che non stai ancora usando</title><link>https://thedotnetblog.com/it/news/emiliano-montesdeoca/dotnet-modernization-assessment-github-copilot/</link><pubDate>Fri, 10 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/it/news/emiliano-montesdeoca/dotnet-modernization-assessment-github-copilot/</guid><description>L'estensione di modernizzazione di GitHub Copilot non si limita a suggerire modifiche al codice — produce una valutazione completa della migrazione con issue azionabili, confronti tra target Azure e un workflow collaborativo. Ecco perché il documento di valutazione è la chiave di tutto.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Questo post è stato tradotto automaticamente. Per la versione originale, &lt;a href="https://thedotnetblog.com/it/news/emiliano-montesdeoca/dotnet-modernization-assessment-github-copilot/"&gt;clicca qui&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Migrare un&amp;rsquo;app legacy .NET Framework a .NET moderno è una di quelle attività che tutti sanno di dover fare ma che nessuno vuole iniziare. Non è mai solo &amp;ldquo;cambiare il target framework.&amp;rdquo; Sono API che sono scomparse, pacchetti che non esistono più, modelli di hosting che funzionano in modo completamente diverso, e un milione di piccole decisioni su cosa containerizzare, cosa riscrivere e cosa lasciare così.&lt;/p&gt;
&lt;p&gt;Jeffrey Fritz ha appena pubblicato un &lt;a href="https://devblogs.microsoft.com/dotnet/your-migrations-source-of-truth-the-modernization-assessment/"&gt;approfondimento sulla valutazione di modernizzazione di GitHub Copilot&lt;/a&gt;, e onestamente? È il miglior tooling di migrazione che abbia visto per .NET. Non per la generazione di codice — quello è ormai standard. Per il documento di valutazione che produce.&lt;/p&gt;
&lt;h2 id="non-è-solo-un-motore-di-suggerimenti-di-codice"&gt;Non è solo un motore di suggerimenti di codice&lt;/h2&gt;
&lt;p&gt;L&amp;rsquo;estensione VS Code segue un modello &lt;strong&gt;Valuta → Pianifica → Esegui&lt;/strong&gt;. La fase di valutazione analizza l&amp;rsquo;intero codebase e produce un documento strutturato che cattura tutto: cosa deve cambiare, quali risorse Azure provisionare, quale modello di deployment usare. Tutto ciò che segue — infrastructure as code, containerizzazione, manifesti di deployment — deriva da ciò che la valutazione trova.&lt;/p&gt;
&lt;p&gt;La valutazione viene salvata in &lt;code&gt;.github/modernize/assessment/&lt;/code&gt; nel tuo progetto. Ogni esecuzione produce un report indipendente, così accumuli uno storico e puoi monitorare come la tua postura di migrazione evolve man mano che risolvi gli issue.&lt;/p&gt;
&lt;h2 id="due-modi-per-iniziare"&gt;Due modi per iniziare&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Valutazione Consigliata&lt;/strong&gt; — il percorso veloce. Scegli tra domini curati (Upgrade Java/.NET, Cloud Readiness, Sicurezza) e ottieni risultati significativi senza toccare la configurazione. Ottimo per un primo sguardo a dove si trova la tua app.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Valutazione Personalizzata&lt;/strong&gt; — il percorso mirato. Configura esattamente cosa analizzare: compute target (App Service, AKS, Container Apps), OS target, analisi della containerizzazione. Scegli più target Azure per confrontare gli approcci di migrazione fianco a fianco.&lt;/p&gt;
&lt;p&gt;Quella vista di confronto è genuinamente utile. Un&amp;rsquo;app con 3 issue obbligatori per App Service potrebbe averne 7 per AKS. Vedere entrambi aiuta a guidare la decisione sull&amp;rsquo;hosting prima di impegnarsi in un percorso di migrazione.&lt;/p&gt;
&lt;h2 id="la-suddivisione-degli-issue-è-azionabile"&gt;La suddivisione degli issue è azionabile&lt;/h2&gt;
&lt;p&gt;Ogni issue viene con un livello di criticità:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Obbligatorio&lt;/strong&gt; — deve essere risolto o la migrazione fallisce&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Potenziale&lt;/strong&gt; — potrebbe impattare la migrazione, necessita di giudizio umano&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Opzionale&lt;/strong&gt; — miglioramenti raccomandati, non bloccano la migrazione&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;E ogni issue linka ai file interessati e numeri di riga, fornisce una descrizione dettagliata di cosa c&amp;rsquo;è che non va e perché conta per la tua piattaforma target, dà passaggi concreti di remediation (non solo &amp;ldquo;sistema questo&amp;rdquo;), e include link alla documentazione ufficiale.&lt;/p&gt;
&lt;p&gt;Puoi assegnare singoli issue agli sviluppatori e hanno tutto ciò di cui hanno bisogno per agire. Questa è la differenza tra uno strumento che ti dice &amp;ldquo;c&amp;rsquo;è un problema&amp;rdquo; e uno che ti dice come risolverlo.&lt;/p&gt;
&lt;h2 id="i-percorsi-di-upgrade-coperti"&gt;I percorsi di upgrade coperti&lt;/h2&gt;
&lt;p&gt;Per .NET specificamente:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;.NET Framework → .NET 10&lt;/li&gt;
&lt;li&gt;ASP.NET → ASP.NET Core&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Ogni percorso di upgrade ha regole di rilevamento che sanno quali API sono state rimosse, quali pattern non hanno un equivalente diretto e quali problemi di sicurezza richiedono attenzione.&lt;/p&gt;
&lt;p&gt;Per i team che gestiscono più applicazioni, c&amp;rsquo;è anche un CLI che supporta valutazioni batch multi-repo — clona tutti i repo, valutali tutti, ottieni report per app più una vista aggregata del portfolio.&lt;/p&gt;
&lt;h2 id="la-mia-opinione"&gt;La mia opinione&lt;/h2&gt;
&lt;p&gt;Se sei seduto su applicazioni legacy .NET Framework (e siamo onesti, la maggior parte dei team enterprise lo è), questo è &lt;em&gt;lo&lt;/em&gt; strumento con cui iniziare. Il solo documento di valutazione vale il tempo — trasforma un vago &amp;ldquo;dovremmo modernizzare&amp;rdquo; in una lista concreta e prioritizzata di elementi di lavoro con percorsi chiari in avanti.&lt;/p&gt;
&lt;p&gt;Il workflow collaborativo è intelligente anche: esporta le valutazioni, condividile con il tuo team, importale senza rieseguire. Review di architettura dove chi decide non è chi esegue gli strumenti? Coperto.&lt;/p&gt;
&lt;h2 id="conclusione"&gt;Conclusione&lt;/h2&gt;
&lt;p&gt;La valutazione di modernizzazione di GitHub Copilot trasforma la migrazione .NET da un progetto spaventoso e indefinito in un processo strutturato e tracciabile. Inizia con una valutazione consigliata per vedere a che punto sei, poi usa valutazioni personalizzate per confrontare i target Azure e costruire il tuo piano di migrazione.&lt;/p&gt;
&lt;p&gt;Leggi il &lt;a href="https://devblogs.microsoft.com/dotnet/your-migrations-source-of-truth-the-modernization-assessment/"&gt;walkthrough completo&lt;/a&gt; e scarica l&amp;rsquo;&lt;a href="https://aka.ms/ghcp-appmod/vscode-ext"&gt;estensione VS Code&lt;/a&gt; per provarla sul tuo codebase.&lt;/p&gt;</content:encoded></item><item><title>Le MCP Apps hanno una Fluent API — Crea interfacce ricche per strumenti AI in .NET in tre passaggi</title><link>https://thedotnetblog.com/it/news/emiliano-montesdeoca/mcp-fluent-api-azure-functions-dotnet/</link><pubDate>Fri, 10 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/it/news/emiliano-montesdeoca/mcp-fluent-api-azure-functions-dotnet/</guid><description>La nuova API di configurazione fluent per le MCP Apps su Azure Functions ti permette di trasformare qualsiasi strumento MCP .NET in un'app completa con viste, permessi e policy CSP in poche righe di codice.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Questo post è stato tradotto automaticamente. Per la versione originale, &lt;a href="https://thedotnetblog.com/it/news/emiliano-montesdeoca/mcp-fluent-api-azure-functions-dotnet/"&gt;clicca qui&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Gli strumenti MCP sono fantastici per dare capacità agli agenti AI. Ma cosa succede se il tuo strumento deve mostrare qualcosa all&amp;rsquo;utente — una dashboard, un form, una visualizzazione interattiva? È qui che entrano in gioco le MCP Apps, e ora sono diventate molto più facili da costruire.&lt;/p&gt;
&lt;p&gt;Lilian Kasem del team Azure SDK &lt;a href="https://devblogs.microsoft.com/azure-sdk/mcp-as-easy-as-1-2-3-introducing-the-fluent-api-for-mcp-apps/"&gt;ha presentato la nuova API di configurazione fluent&lt;/a&gt; per le MCP Apps su Azure Functions .NET, ed è il tipo di miglioramento dell&amp;rsquo;esperienza sviluppatore che ti fa chiedere perché non fosse sempre così semplice.&lt;/p&gt;
&lt;h2 id="cosa-sono-le-mcp-apps"&gt;Cosa sono le MCP Apps?&lt;/h2&gt;
&lt;p&gt;Le MCP Apps estendono il Model Context Protocol permettendo agli strumenti di portare le proprie viste UI, asset statici e controlli di sicurezza. Invece di restituire solo testo, il tuo strumento MCP può renderizzare esperienze HTML complete — dashboard interattive, visualizzazioni di dati, form di configurazione — tutto invocabile dagli agenti AI e presentato agli utenti dai client MCP.&lt;/p&gt;
&lt;p&gt;Il problema era che collegare tutto manualmente richiedeva di conoscere la specifica MCP in profondità: URI &lt;code&gt;ui://&lt;/code&gt;, tipi MIME speciali, coordinamento dei metadati tra strumenti e risorse. Non difficile, ma noioso.&lt;/p&gt;
&lt;h2 id="la-fluent-api-in-tre-passaggi"&gt;La Fluent API in tre passaggi&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Passaggio 1: Definisci la tua funzione.&lt;/strong&gt; Uno strumento MCP standard di Azure Functions:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt;[Function(nameof(HelloApp))]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;HelloApp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt; [McpToolTrigger(&amp;#34;HelloApp&amp;#34;, &amp;#34;A simple MCP App that says hello.&amp;#34;)]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;ToolInvocationContext&lt;/span&gt; &lt;span class="n"&gt;context&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;Hello from app&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Passaggio 2: Promuovila a MCP App.&lt;/strong&gt; Nello startup del tuo programma:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;builder&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ConfigureMcpTool&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;HelloApp&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AsMcpApp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;app&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;app&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WithView&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;assets/hello-app.html&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WithTitle&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Hello App&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WithPermissions&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;McpAppPermissions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ClipboardWrite&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; &lt;span class="n"&gt;McpAppPermissions&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ClipboardRead&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WithCsp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;csp&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;csp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AllowBaseUri&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;https://www.microsoft.com&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ConnectTo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;https://www.microsoft.com&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}));&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Passaggio 3: Aggiungi la tua vista HTML.&lt;/strong&gt; Crea &lt;code&gt;assets/hello-app.html&lt;/code&gt; con l&amp;rsquo;interfaccia di cui hai bisogno.&lt;/p&gt;
&lt;p&gt;Tutto qui. La Fluent API gestisce tutta l&amp;rsquo;infrastruttura del protocollo MCP — genera la funzione risorsa sintetica, imposta il tipo MIME corretto e inietta i metadati che collegano il tuo strumento alla sua vista.&lt;/p&gt;
&lt;h2 id="la-superficie-dellapi-è-ben-progettata"&gt;La superficie dell&amp;rsquo;API è ben progettata&lt;/h2&gt;
&lt;p&gt;Alcune cose che mi piacciono molto:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Le fonti delle viste sono flessibili.&lt;/strong&gt; Puoi servire HTML da file su disco, o incorporare risorse direttamente nel tuo assembly per deployment autonomi:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WithView&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;McpViewSource&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;FromFile&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;assets/my-view.html&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;app&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WithView&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;McpViewSource&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;FromEmbeddedResource&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;MyApp.Resources.view.html&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Il CSP è componibile.&lt;/strong&gt; Autorizzi esplicitamente le origini di cui la tua app ha bisogno, seguendo i principi del minimo privilegio. Chiama &lt;code&gt;WithCsp&lt;/code&gt; più volte e le origini si accumulano:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WithCsp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;csp&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;csp&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ConnectTo&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;https://api.example.com&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;LoadResourcesFrom&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;https://cdn.example.com&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AllowFrame&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;https://youtube.com&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;})&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Controllo della visibilità.&lt;/strong&gt; Puoi rendere uno strumento visibile solo al LLM, solo all&amp;rsquo;UI dell&amp;rsquo;host, o entrambi. Vuoi uno strumento che renderizza solo UI e non dovrebbe essere chiamato dal modello? Facile:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WithVisibility&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;McpVisibility&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;App&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;// UI-only, hidden from the model&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="per-iniziare"&gt;Per iniziare&lt;/h2&gt;
&lt;p&gt;Aggiungi il pacchetto preview:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;dotnet add package Microsoft.Azure.Functions.Worker.Extensions.Mcp --version 1.5.0-preview.1
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Se stai già costruendo strumenti MCP con Azure Functions, è solo un aggiornamento del pacchetto. Il &lt;a href="https://learn.microsoft.com/azure/azure-functions/scenario-mcp-apps?tabs=bash%2Clinux&amp;amp;pivots=programming-language-csharp"&gt;quickstart MCP Apps&lt;/a&gt; è il miglior punto di partenza se sei nuovo al concetto.&lt;/p&gt;
&lt;h2 id="conclusione"&gt;Conclusione&lt;/h2&gt;
&lt;p&gt;Le MCP Apps sono uno degli sviluppi più entusiasmanti nello spazio degli strumenti AI — strumenti che non solo &lt;em&gt;fanno cose&lt;/em&gt; ma possono &lt;em&gt;mostrare cose&lt;/em&gt; agli utenti. La Fluent API rimuove la complessità del protocollo e ti permette di concentrarti su ciò che conta: la logica del tuo strumento e la sua interfaccia.&lt;/p&gt;
&lt;p&gt;Leggi il &lt;a href="https://devblogs.microsoft.com/azure-sdk/mcp-as-easy-as-1-2-3-introducing-the-fluent-api-for-mcp-apps/"&gt;post completo&lt;/a&gt; per il riferimento completo dell&amp;rsquo;API e gli esempi.&lt;/p&gt;</content:encoded></item><item><title>C# 15 introduce i tipi union — e sono esattamente quello che stavamo chiedendo</title><link>https://thedotnetblog.com/it/news/emiliano-montesdeoca/csharp-15-union-types-exhaustive-matching/</link><pubDate>Sun, 05 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/it/news/emiliano-montesdeoca/csharp-15-union-types-exhaustive-matching/</guid><description>C# 15 introduce la parola chiave union — unioni discriminate con pattern matching esaustivo imposto dal compilatore. Ecco come appaiono, perché sono importanti e come provarle oggi.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Questo post è stato tradotto automaticamente. Per la versione originale, &lt;a href="https://thedotnetblog.com/it/news/emiliano-montesdeoca/csharp-15-union-types-exhaustive-matching/"&gt;clicca qui&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Questa è quella che stavo aspettando. C# 15 introduce la parola chiave &lt;code&gt;union&lt;/code&gt; — vere unioni discriminate con pattern matching esaustivo imposto dal compilatore. Se hai mai invidiato le unioni discriminate di F# o gli enum di Rust, sai esattamente perché questo è importante.&lt;/p&gt;
&lt;p&gt;Bill Wagner ha &lt;a href="https://devblogs.microsoft.com/dotnet/csharp-15-union-types/"&gt;pubblicato l&amp;rsquo;approfondimento&lt;/a&gt; sul blog .NET, e onestamente? Il design è pulito, pratico e molto C#. Lascia che ti mostri cosa c&amp;rsquo;è davvero e perché è una cosa più grande di quanto possa sembrare a prima vista.&lt;/p&gt;
&lt;h2 id="il-problema-che-le-union-risolvono"&gt;Il problema che le union risolvono&lt;/h2&gt;
&lt;p&gt;Prima di C# 15, restituire &amp;ldquo;uno tra diversi tipi possibili&amp;rdquo; da un metodo era sempre un compromesso:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;&lt;code&gt;object&lt;/code&gt;&lt;/strong&gt; — nessun vincolo, nessun aiuto dal compilatore, casting difensivo ovunque&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Interfacce marcatore&lt;/strong&gt; — meglio, ma chiunque può implementarle. Il compilatore non può mai considerare l&amp;rsquo;insieme completo&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Classi base astratte&lt;/strong&gt; — stesso problema, in più i tipi hanno bisogno di un antenato comune&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Nessuna di queste ti dà quello che vuoi veramente: un insieme chiuso di tipi dove il compilatore garantisce che hai gestito ogni caso. Questo è quello che fanno i tipi union.&lt;/p&gt;
&lt;h2 id="la-sintassi-è-di-una-semplicità-elegante"&gt;La sintassi è di una semplicità elegante&lt;/h2&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="k"&gt;record&lt;/span&gt; &lt;span class="nc"&gt;class&lt;/span&gt; &lt;span class="n"&gt;Cat&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="k"&gt;record&lt;/span&gt; &lt;span class="nc"&gt;class&lt;/span&gt; &lt;span class="n"&gt;Dog&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="k"&gt;record&lt;/span&gt; &lt;span class="nc"&gt;class&lt;/span&gt; &lt;span class="n"&gt;Bird&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="n"&gt;union&lt;/span&gt; &lt;span class="n"&gt;Pet&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;Cat&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Dog&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Bird&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Una riga. &lt;code&gt;Pet&lt;/code&gt; può contenere un &lt;code&gt;Cat&lt;/code&gt;, un &lt;code&gt;Dog&lt;/code&gt; o un &lt;code&gt;Bird&lt;/code&gt;. Le conversioni implicite vengono generate automaticamente:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Pet&lt;/span&gt; &lt;span class="n"&gt;pet&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Dog&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Rex&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;pet&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Value&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="c1"&gt;// Dog { Name = Rex }&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ed ecco la magia — il compilatore impone il matching esaustivo:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;string&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;pet&lt;/span&gt; &lt;span class="k"&gt;switch&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Dog&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;d&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Cat&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;c&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Bird&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Nessun discard &lt;code&gt;_&lt;/code&gt; necessario. Il compilatore sa che questo switch copre ogni caso possibile. Se successivamente aggiungi un quarto tipo alla union, ogni espressione switch che non lo gestisce produce un avviso. Casi mancanti rilevati al momento della compilazione, non a runtime.&lt;/p&gt;
&lt;h2 id="dove-diventa-pratico"&gt;Dove diventa pratico&lt;/h2&gt;
&lt;p&gt;L&amp;rsquo;esempio di &lt;code&gt;Pet&lt;/code&gt; è carino, ma è qui che le union brillano davvero nel codice reale.&lt;/p&gt;
&lt;h3 id="risposte-api-che-restituiscono-forme-diverse"&gt;Risposte API che restituiscono forme diverse&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="n"&gt;union&lt;/span&gt; &lt;span class="n"&gt;ApiResult&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ApiError&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ValidationFailure&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Ora ogni consumatore è obbligato a gestire successo, errore e fallimento di validazione. Niente più bug da &amp;ldquo;ho dimenticato di controllare il caso di errore&amp;rdquo;.&lt;/p&gt;
&lt;h3 id="valore-singolo-o-collection"&gt;Valore singolo o collection&lt;/h3&gt;
&lt;p&gt;Il pattern &lt;code&gt;OneOrMore&amp;lt;T&amp;gt;&lt;/code&gt; mostra come le union possono avere un corpo con metodi di utilità:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="n"&gt;union&lt;/span&gt; &lt;span class="n"&gt;OneOrMore&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;(&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;IEnumerable&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="n"&gt;IEnumerable&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;AsEnumerable&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;Value&lt;/span&gt; &lt;span class="k"&gt;switch&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;T&lt;/span&gt; &lt;span class="n"&gt;single&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;single&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;IEnumerable&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="n"&gt;T&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;multiple&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;multiple&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kc"&gt;null&lt;/span&gt; &lt;span class="p"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I chiamanti passano la forma che preferiscono:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;OneOrMore&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;tags&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;dotnet&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;OneOrMore&lt;/span&gt;&lt;span class="p"&gt;&amp;lt;&lt;/span&gt;&lt;span class="kt"&gt;string&lt;/span&gt;&lt;span class="p"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;moreTags&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="p"&gt;[]&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;csharp&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;unions&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;preview&amp;#34;&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;tag&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;tags&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AsEnumerable&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;$&amp;#34;[{tag}] &amp;#34;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// [dotnet]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id="comporre-tipi-non-correlati"&gt;Comporre tipi non correlati&lt;/h3&gt;
&lt;p&gt;Questa è la funzionalità killer rispetto alle gerarchie tradizionali. Puoi unire tipi che non hanno nulla in comune — &lt;code&gt;string&lt;/code&gt; e &lt;code&gt;Exception&lt;/code&gt;, &lt;code&gt;int&lt;/code&gt; e &lt;code&gt;IEnumerable&amp;lt;T&amp;gt;&lt;/code&gt;. Nessun antenato comune necessario.&lt;/p&gt;
&lt;h2 id="union-personalizzate-per-librerie-esistenti"&gt;Union personalizzate per librerie esistenti&lt;/h2&gt;
&lt;p&gt;Ecco una scelta di design intelligente: qualsiasi classe o struct con un attributo &lt;code&gt;[Union]&lt;/code&gt; viene riconosciuta come tipo union, purché segua il pattern di base (costruttori pubblici per i tipi di caso e una proprietà &lt;code&gt;Value&lt;/code&gt;). Librerie come OneOf che già forniscono tipi simili alle union possono optare per il supporto del compilatore senza riscrivere i loro interni.&lt;/p&gt;
&lt;p&gt;Per scenari sensibili alle performance con tipi di valore, le librerie possono implementare un pattern di accesso senza boxing con i metodi &lt;code&gt;HasValue&lt;/code&gt; e &lt;code&gt;TryGetValue&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="il-quadro-generale"&gt;Il quadro generale&lt;/h2&gt;
&lt;p&gt;I tipi union fanno parte di una storia più ampia di esaustività in arrivo in C#:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Tipi union&lt;/strong&gt; — matching esaustivo su un insieme chiuso di tipi (disponibile ora in preview)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Gerarchie chiuse&lt;/strong&gt; — il modificatore &lt;code&gt;closed&lt;/code&gt; impedisce classi derivate al di fuori dell&amp;rsquo;assembly di definizione (proposto)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Enum chiusi&lt;/strong&gt; — impedisce la creazione di valori diversi dai membri dichiarati (proposto)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Insieme, queste tre funzionalità daranno a C# uno dei sistemi di pattern matching type-safe più completi in qualsiasi linguaggio mainstream.&lt;/p&gt;
&lt;h2 id="provale-oggi"&gt;Provale oggi&lt;/h2&gt;
&lt;p&gt;I tipi union sono disponibili in .NET 11 Preview 2:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Installa il &lt;a href="https://dotnet.microsoft.com/download/dotnet"&gt;SDK .NET 11 Preview&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Imposta come target &lt;code&gt;net11.0&lt;/code&gt; nel tuo progetto&lt;/li&gt;
&lt;li&gt;Imposta &lt;code&gt;&amp;lt;LangVersion&amp;gt;preview&amp;lt;/LangVersion&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Un&amp;rsquo;avvertenza: in Preview 2, dovrai dichiarare &lt;code&gt;UnionAttribute&lt;/code&gt; e &lt;code&gt;IUnion&lt;/code&gt; nel tuo progetto poiché non sono ancora nel runtime. Prendi &lt;a href="https://github.com/dotnet/docs/blob/e68b5dd1e557b53c45ca43e61b013bc919619fb9/docs/csharp/language-reference/builtin-types/snippets/unions/RuntimePolyfill.cs"&gt;RuntimePolyfill.cs&lt;/a&gt; dal repo docs, o aggiungi questo:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;namespace&lt;/span&gt; &lt;span class="nn"&gt;System.Runtime.CompilerServices&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt; [AttributeUsage(AttributeTargets.Class | AttributeTargets.Struct,
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="na"&gt; AllowMultiple = false)]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="kd"&gt;sealed&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;UnionAttribute&lt;/span&gt; &lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;Attribute&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kd"&gt;public&lt;/span&gt; &lt;span class="k"&gt;interface&lt;/span&gt; &lt;span class="nc"&gt;IUnion&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="kt"&gt;object?&lt;/span&gt; &lt;span class="n"&gt;Value&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="k"&gt;get&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="per-concludere"&gt;Per concludere&lt;/h2&gt;
&lt;p&gt;I tipi union sono una di quelle funzionalità che ti fanno chiedere come abbiamo fatto senza. Pattern matching esaustivo imposto dal compilatore, sintassi pulita, supporto ai generici e integrazione con il pattern matching esistente — è tutto quello che abbiamo chiesto, fatto alla maniera C#.&lt;/p&gt;
&lt;p&gt;Provale in .NET 11 Preview 2, rompi cose e &lt;a href="https://github.com/dotnet/csharplang/discussions/9663"&gt;condividi il tuo feedback su GitHub&lt;/a&gt;. Questa è una preview, e il team C# sta attivamente ascoltando. I tuoi edge case e feedback di design daranno forma alla release finale.&lt;/p&gt;
&lt;p&gt;Per il riferimento completo del linguaggio, consulta la &lt;a href="https://learn.microsoft.com/dotnet/csharp/language-reference/builtin-types/union"&gt;documentazione dei tipi union&lt;/a&gt; e la &lt;a href="https://learn.microsoft.com/dotnet/csharp/language-reference/proposals/unions"&gt;specifica della funzionalità&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title>Aspire 13.2 include una CLI per la documentazione — e anche il tuo agente IA può usarla</title><link>https://thedotnetblog.com/it/news/emiliano-montesdeoca/aspire-docs-cli-ai-skills/</link><pubDate>Sat, 04 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/it/news/emiliano-montesdeoca/aspire-docs-cli-ai-skills/</guid><description>.NET Aspire 13.2 aggiunge aspire docs — una CLI per cercare, esplorare e leggere la documentazione ufficiale senza uscire dal terminale. Funziona anche come strumento per agenti IA. Ecco perché è importante.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Questo post è stato tradotto automaticamente. Per la versione originale, &lt;a href="https://thedotnetblog.com/it/news/emiliano-montesdeoca/aspire-docs-cli-ai-skills/"&gt;clicca qui&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Conosci quel momento in cui sei immerso in un Aspire AppHost, stai collegando integrazioni, e devi controllare esattamente quali parametri si aspetta l&amp;rsquo;integrazione Redis? Fai alt-tab al browser, cerchi su aspire.dev, strizzi gli occhi sulla documentazione delle API, poi torni al tuo editor. Contesto perso. Flusso interrotto.&lt;/p&gt;
&lt;p&gt;Aspire 13.2 ha appena &lt;a href="https://devblogs.microsoft.com/aspire/aspire-docs-in-your-terminal/"&gt;rilasciato una soluzione per questo&lt;/a&gt;. La CLI &lt;code&gt;aspire docs&lt;/code&gt; ti permette di cercare, esplorare e leggere la documentazione ufficiale di Aspire direttamente dal tuo terminale. E siccome è supportata da servizi riutilizzabili, gli agenti IA e le skill possono usare gli stessi comandi per consultare la documentazione invece di allucinare API che non esistono.&lt;/p&gt;
&lt;h2 id="il-problema-che-questo-risolve-davvero"&gt;Il problema che questo risolve davvero&lt;/h2&gt;
&lt;p&gt;David Pine lo dice perfettamente nel post originale: gli agenti IA erano &lt;em&gt;terribili&lt;/em&gt; nell&amp;rsquo;aiutare gli sviluppatori a costruire app con Aspire. Raccomandavano &lt;code&gt;dotnet run&lt;/code&gt; invece di &lt;code&gt;aspire run&lt;/code&gt;, facevano riferimento a learn.microsoft.com per docs che vivono su aspire.dev, suggerivano pacchetti NuGet obsoleti, e — il mio preferito — allucinavano API inesistenti.&lt;/p&gt;
&lt;p&gt;Perché? Perché Aspire è stato specifico per .NET molto più a lungo di quanto sia stato poliglotta, e i LLM lavorano con dati di addestramento che precedono le ultime funzionalità. Quando dai a un agente IA la possibilità di consultare la documentazione attuale, smette di tirare a indovinare e inizia a essere utile.&lt;/p&gt;
&lt;h2 id="tre-comandi-zero-schede-del-browser"&gt;Tre comandi, zero schede del browser&lt;/h2&gt;
&lt;p&gt;La CLI è di una semplicità rinfrescante:&lt;/p&gt;
&lt;h3 id="elencare-tutta-la-documentazione"&gt;Elencare tutta la documentazione&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aspire docs list
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Restituisce ogni pagina di documentazione disponibile su aspire.dev. Serve un output leggibile dalle macchine? Aggiungi &lt;code&gt;--format Json&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id="cercare-un-argomento"&gt;Cercare un argomento&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aspire docs search &lt;span class="s2"&gt;&amp;#34;redis&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Cerca sia nei titoli che nei contenuti con punteggio di rilevanza ponderato. Lo stesso motore di ricerca che alimenta internamente gli strumenti di documentazione. Ottieni risultati classificati con titoli, slug e punteggi di rilevanza.&lt;/p&gt;
&lt;h3 id="leggere-una-pagina-intera-o-solo-una-sezione"&gt;Leggere una pagina intera (o solo una sezione)&lt;/h3&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aspire docs get redis-integration
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Trasmette la pagina completa in markdown nel tuo terminale. Ti serve solo una sezione?&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aspire docs get redis-integration --section &lt;span class="s2"&gt;&amp;#34;Add Redis resource&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Precisione chirurgica. Niente scrolling su 500 righe. Solo la parte che ti serve.&lt;/p&gt;
&lt;h2 id="laspetto-agente-ia"&gt;L&amp;rsquo;aspetto agente IA&lt;/h2&gt;
&lt;p&gt;Ecco dove diventa interessante per noi sviluppatori che costruiamo con strumenti IA. Gli stessi comandi &lt;code&gt;aspire docs&lt;/code&gt; funzionano come strumenti per agenti IA — tramite skill, server MCP, o semplici wrapper CLI.&lt;/p&gt;
&lt;p&gt;Invece di far inventare al tuo assistente IA delle API Aspire basate su dati di addestramento obsoleti, può chiamare &lt;code&gt;aspire docs search &amp;quot;postgres&amp;quot;&lt;/code&gt;, trovare la documentazione ufficiale dell&amp;rsquo;integrazione, leggere la pagina giusta, e darti l&amp;rsquo;approccio documentato. Documentazione in tempo reale e aggiornata — non quello che il modello ha memorizzato sei mesi fa.&lt;/p&gt;
&lt;p&gt;L&amp;rsquo;architettura dietro tutto questo è intenzionale. Il team Aspire ha costruito servizi riutilizzabili (&lt;code&gt;IDocsIndexService&lt;/code&gt;, &lt;code&gt;IDocsSearchService&lt;/code&gt;, &lt;code&gt;IDocsFetcher&lt;/code&gt;, &lt;code&gt;IDocsCache&lt;/code&gt;) anziché un&amp;rsquo;integrazione una tantum. Questo significa che lo stesso motore di ricerca funziona per gli umani nel terminale, gli agenti IA nel tuo editor, e l&amp;rsquo;automazione nella tua pipeline CI.&lt;/p&gt;
&lt;h2 id="scenari-reali"&gt;Scenari reali&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;Consultazioni rapide nel terminale:&lt;/strong&gt; Sei tre file in profondità e hai bisogno dei parametri di configurazione Redis. Due comandi, novanta secondi, di nuovo al lavoro:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aspire docs search &lt;span class="s2"&gt;&amp;#34;redis&amp;#34;&lt;/span&gt; --limit &lt;span class="m"&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aspire docs get redis-integration --section &lt;span class="s2"&gt;&amp;#34;Configuration&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Sviluppo assistito dall&amp;rsquo;IA:&lt;/strong&gt; La tua skill di VS Code avvolge i comandi CLI. Chiedi &amp;ldquo;Aggiungi un database PostgreSQL al mio AppHost&amp;rdquo; e l&amp;rsquo;agente consulta i docs reali prima di rispondere. Nessuna allucinazione.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Validazione CI/CD:&lt;/strong&gt; La tua pipeline valida le configurazioni AppHost contro la documentazione ufficiale in modo programmatico. L&amp;rsquo;output &lt;code&gt;--format Json&lt;/code&gt; si collega in modo pulito a &lt;code&gt;jq&lt;/code&gt; e altri strumenti.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Basi di conoscenza personalizzate:&lt;/strong&gt; Stai costruendo i tuoi strumenti IA? Invia l&amp;rsquo;output JSON strutturato direttamente nella tua base di conoscenza:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-bash" data-lang="bash"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;aspire docs search &lt;span class="s2"&gt;&amp;#34;monitoring&amp;#34;&lt;/span&gt; --format Json &lt;span class="p"&gt;|&lt;/span&gt; jq &lt;span class="s1"&gt;&amp;#39;[.[] | {slug, title, summary}]&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Niente web scraping. Niente chiavi API. Gli stessi dati strutturati usati internamente dagli strumenti di documentazione.&lt;/p&gt;
&lt;h2 id="la-documentazione-è-sempre-aggiornata"&gt;La documentazione è sempre aggiornata&lt;/h2&gt;
&lt;p&gt;Questa è la parte che apprezzo di più. La CLI non scarica uno snapshot — interroga aspire.dev con caching basato su ETag. Nel momento in cui la documentazione viene aggiornata, la tua CLI e qualsiasi skill costruita su di essa lo riflette. Niente copie obsolete, niente momenti &amp;ldquo;ma il wiki diceva&amp;hellip;&amp;rdquo;.&lt;/p&gt;
&lt;h2 id="per-concludere"&gt;Per concludere&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;aspire docs&lt;/code&gt; è una di quelle piccole funzionalità che risolve un problema reale in modo pulito. Gli umani ottengono accesso alla documentazione nativo nel terminale. Gli agenti IA ottengono un modo per smettere di indovinare e iniziare a fare riferimento a docs reali. E tutto è supportato dalla stessa fonte di verità.&lt;/p&gt;
&lt;p&gt;Se stai costruendo con .NET Aspire e non hai ancora provato la CLI, esegui &lt;code&gt;aspire docs search &amp;quot;il-tuo-argomento-qui&amp;quot;&lt;/code&gt; e vedi come ti sembra. Poi considera di integrare quei comandi nella skill IA o nella configurazione di automazione che stai usando — i tuoi agenti ti ringrazieranno.&lt;/p&gt;
&lt;p&gt;Dai un&amp;rsquo;occhiata all&amp;rsquo;&lt;a href="https://davidpine.dev/posts/aspire-docs-mcp-tools/"&gt;approfondimento di David Pine&lt;/a&gt; su come sono nati gli strumenti di documentazione, e al &lt;a href="https://aspire.dev/reference/cli/commands/aspire-docs/"&gt;riferimento ufficiale della CLI&lt;/a&gt; per tutti i dettagli.&lt;/p&gt;</content:encoded></item><item><title>Microsoft Agent Framework Raggiunge la 1.0 — Ecco Cosa Conta Davvero per gli Sviluppatori .NET</title><link>https://thedotnetblog.com/it/news/emiliano-montesdeoca/agent-framework-1-0-production-ready/</link><pubDate>Fri, 03 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/it/news/emiliano-montesdeoca/agent-framework-1-0-production-ready/</guid><description>Microsoft Agent Framework 1.0 è pronto per la produzione con API stabili, orchestrazione multi-agente e connettori per tutti i principali provider di IA. Ecco cosa devi sapere come sviluppatore .NET.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Questo post è stato tradotto automaticamente. Per la versione originale, &lt;a href="https://thedotnetblog.com/it/news/emiliano-montesdeoca/agent-framework-1-0-production-ready/"&gt;clicca qui&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Se hai seguito il percorso di Agent Framework dai primi giorni di Semantic Kernel e AutoGen, questo è significativo. Microsoft Agent Framework ha appena &lt;a href="https://devblogs.microsoft.com/agent-framework/microsoft-agent-framework-version-1-0/"&gt;raggiunto la versione 1.0&lt;/a&gt; — pronto per la produzione, API stabili, impegno di supporto a lungo termine. È disponibile sia per .NET che per Python, ed è genuinamente pronto per carichi di lavoro reali.&lt;/p&gt;
&lt;p&gt;Vi taglio attraverso il rumore dell&amp;rsquo;annuncio e mi concentro su ciò che conta se state costruendo app alimentate dall&amp;rsquo;IA con .NET.&lt;/p&gt;
&lt;h2 id="la-versione-breve"&gt;La versione breve&lt;/h2&gt;
&lt;p&gt;Agent Framework 1.0 unifica quello che erano Semantic Kernel e AutoGen in un singolo SDK open source. Un&amp;rsquo;astrazione di agente. Un motore di orchestrazione. Molteplici provider di IA. Se avete saltato tra Semantic Kernel per i pattern enterprise e AutoGen per i workflow multi-agente di livello ricerca, potete smettere. Questo è l&amp;rsquo;unico SDK ora.&lt;/p&gt;
&lt;h2 id="iniziare-è-quasi-ingiustamente-semplice"&gt;Iniziare è quasi ingiustamente semplice&lt;/h2&gt;
&lt;p&gt;Ecco un agente funzionante in .NET:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// dotnet add package Microsoft.Agents.AI.OpenAI --prerelease&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;Microsoft.Agents.AI&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;Microsoft.Agents.AI.Foundry&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="nn"&gt;Azure.Identity&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;AIProjectClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;endpoint&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;https://your-project.services.ai.azure.com&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GetResponsesClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;gpt-5.3&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AsAIAgent&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;HaikuBot&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;instructions&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s"&gt;&amp;#34;You are an upbeat assistant that writes beautifully.&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;RunAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;Write a haiku about shipping 1.0.&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Tutto qui. Una manciata di righe e hai un agente IA che gira su Azure Foundry. L&amp;rsquo;equivalente Python è altrettanto conciso. Aggiungi strumenti di funzione, conversazioni multi-turno e streaming man mano che procedi — la superficie dell&amp;rsquo;API scala senza diventare strana.&lt;/p&gt;
&lt;h2 id="orchestrazione-multi-agente--questa-è-la-cosa-seria"&gt;Orchestrazione multi-agente — questa è la cosa seria&lt;/h2&gt;
&lt;p&gt;Gli agenti singoli vanno bene per le demo, ma gli scenari di produzione di solito necessitano di coordinamento. Agent Framework 1.0 arriva con pattern di orchestrazione testati in battaglia direttamente da Microsoft Research e AutoGen:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Sequenziale&lt;/strong&gt; — gli agenti elaborano in ordine (scrittore → revisore → editor)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Concorrente&lt;/strong&gt; — distribuisci a più agenti in parallelo, convergi i risultati&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Handoff&lt;/strong&gt; — un agente delega a un altro in base all&amp;rsquo;intento&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Chat di gruppo&lt;/strong&gt; — più agenti discutono e convergono su una soluzione&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Magentic-One&lt;/strong&gt; — il pattern multi-agente di livello ricerca di MSR&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Tutti supportano streaming, checkpointing, approvazioni human-in-the-loop e pausa/ripresa. La parte di checkpointing è cruciale — i workflow di lunga durata sopravvivono ai riavvii del processo. Per noi sviluppatori .NET che abbiamo costruito workflow durevoli con Azure Functions, questo è familiare.&lt;/p&gt;
&lt;h2 id="le-funzionalità-che-contano-di-più"&gt;Le funzionalità che contano di più&lt;/h2&gt;
&lt;p&gt;Ecco la mia lista di ciò che vale la pena sapere:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Hook middleware.&lt;/strong&gt; Sapete come ASP.NET Core ha le pipeline middleware? Stesso concetto, ma per l&amp;rsquo;esecuzione degli agenti. Intercetta ogni fase — aggiungi sicurezza dei contenuti, logging, policy di conformità — senza toccare i prompt dell&amp;rsquo;agente. È così che rendi gli agenti pronti per l&amp;rsquo;enterprise.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Memoria pluggable.&lt;/strong&gt; Storico conversazionale, stato persistente chiave-valore, recupero basato su vettori. Scegli il tuo backend: Foundry Agent Service, Mem0, Redis, Neo4j, o costruisci il tuo. La memoria è ciò che trasforma una chiamata LLM senza stato in un agente che ricorda davvero il contesto.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Agenti YAML dichiarativi.&lt;/strong&gt; Definisci le istruzioni del tuo agente, gli strumenti, la memoria e la topologia di orchestrazione in file YAML versionati. Carica ed esegui con una singola chiamata API. Questo è un game-changer per i team che vogliono iterare sul comportamento dell&amp;rsquo;agente senza ridistribuire il codice.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Supporto A2A e MCP.&lt;/strong&gt; MCP (Model Context Protocol) permette agli agenti di scoprire e invocare strumenti esterni dinamicamente. A2A (protocollo Agent-to-Agent) abilita la collaborazione cross-runtime — i tuoi agenti .NET possono coordinarsi con agenti in esecuzione in altri framework. Il supporto A2A 1.0 arriverà presto.&lt;/p&gt;
&lt;h2 id="le-funzionalità-in-preview-da-tenere-docchio"&gt;Le funzionalità in preview da tenere d&amp;rsquo;occhio&lt;/h2&gt;
&lt;p&gt;Alcune funzionalità sono state rilasciate come preview nella 1.0 — funzionali ma le API potrebbero evolvere:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;DevUI&lt;/strong&gt; — un debugger locale basato su browser per visualizzare l&amp;rsquo;esecuzione dell&amp;rsquo;agente, i flussi di messaggi e le chiamate agli strumenti in tempo reale. Pensate ad Application Insights, ma per il ragionamento dell&amp;rsquo;agente.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;GitHub Copilot SDK e Claude Code SDK&lt;/strong&gt; — usa Copilot o Claude come harness dell&amp;rsquo;agente direttamente dal tuo codice di orchestrazione. Componi un agente capace di programmare accanto ai tuoi altri agenti nello stesso workflow.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Agent Harness&lt;/strong&gt; — un runtime locale personalizzabile che dà agli agenti accesso a shell, file system e loop di messaggistica. Pensate ad agenti di coding e pattern di automazione.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Skills&lt;/strong&gt; — pacchetti riutilizzabili di capacità di dominio che danno agli agenti capacità strutturate pronte all&amp;rsquo;uso.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="migrazione-da-semantic-kernel-o-autogen"&gt;Migrazione da Semantic Kernel o AutoGen&lt;/h2&gt;
&lt;p&gt;Se avete codice Semantic Kernel o AutoGen esistente, ci sono assistenti di migrazione dedicati che analizzano il vostro codice e generano piani di migrazione passo dopo passo. La &lt;a href="https://learn.microsoft.com/en-us/agent-framework/migration-guide/from-semantic-kernel"&gt;guida alla migrazione da Semantic Kernel&lt;/a&gt; e la &lt;a href="https://learn.microsoft.com/en-us/agent-framework/migration-guide/from-autogen"&gt;guida alla migrazione da AutoGen&lt;/a&gt; vi accompagnano attraverso tutto.&lt;/p&gt;
&lt;p&gt;Se siete stati sui pacchetti RC, l&amp;rsquo;aggiornamento alla 1.0 è solo un cambio di versione.&lt;/p&gt;
&lt;h2 id="per-concludere"&gt;Per concludere&lt;/h2&gt;
&lt;p&gt;Agent Framework 1.0 è il traguardo di produzione che i team enterprise stavano aspettando. API stabili, supporto multi-provider, pattern di orchestrazione che funzionano davvero su scala, e percorsi di migrazione sia da Semantic Kernel che da AutoGen.&lt;/p&gt;
&lt;p&gt;Il framework è &lt;a href="https://github.com/microsoft/agent-framework"&gt;completamente open source su GitHub&lt;/a&gt;, e potete iniziare oggi con &lt;code&gt;dotnet add package Microsoft.Agents.AI&lt;/code&gt;. Date un&amp;rsquo;occhiata alla &lt;a href="https://learn.microsoft.com/en-us/agent-framework/get-started/"&gt;guida rapida&lt;/a&gt; e agli &lt;a href="https://github.com/microsoft/agent-framework"&gt;esempi&lt;/a&gt; per mettere le mani in pasta.&lt;/p&gt;
&lt;p&gt;Se stavate aspettando il segnale &amp;ldquo;sicuro da usare in produzione&amp;rdquo; — eccolo.&lt;/p&gt;</content:encoded></item><item><title>azd ora permette di eseguire e debuggare agenti IA localmente — Ecco cosa è cambiato a marzo 2026</title><link>https://thedotnetblog.com/it/news/emiliano-montesdeoca/azd-march-2026-local-ai-agent-debugging/</link><pubDate>Thu, 02 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/it/news/emiliano-montesdeoca/azd-march-2026-local-ai-agent-debugging/</guid><description>L'Azure Developer CLI ha rilasciato sette versioni a marzo 2026. I punti salienti: un loop locale di esecuzione e debug per agenti IA, integrazione con GitHub Copilot nella configurazione dei progetti, e supporto per Container App Jobs.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Questo post è stato tradotto automaticamente. Per la versione originale, &lt;a href="https://thedotnetblog.com/it/news/emiliano-montesdeoca/azd-march-2026-local-ai-agent-debugging/"&gt;clicca qui&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Sette rilasci in un mese. È quello che il team dell&amp;rsquo;Azure Developer CLI (&lt;code&gt;azd&lt;/code&gt;) ha pubblicato a marzo 2026, e la funzionalità principale è quella che stavo aspettando: &lt;strong&gt;un loop locale di esecuzione e debug per agenti IA&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;PC Chan &lt;a href="https://devblogs.microsoft.com/azure-sdk/azure-developer-cli-azd-march-2026/"&gt;ha pubblicato il riepilogo completo&lt;/a&gt;, e anche se c&amp;rsquo;è molto contenuto, lasciatemi filtrare ciò che conta davvero per gli sviluppatori .NET che costruiscono app con IA.&lt;/p&gt;
&lt;h2 id="eseguire-e-debuggare-agenti-ia-senza-deploy"&gt;Eseguire e debuggare agenti IA senza deploy&lt;/h2&gt;
&lt;p&gt;Questa è la novità principale. La nuova estensione &lt;code&gt;azure.ai.agents&lt;/code&gt; aggiunge comandi che danno un&amp;rsquo;esperienza di inner-loop adeguata per gli agenti IA:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;azd ai agent run&lt;/code&gt; — avvia il tuo agente localmente&lt;/li&gt;
&lt;li&gt;&lt;code&gt;azd ai agent invoke&lt;/code&gt; — gli invia messaggi (locale o in produzione)&lt;/li&gt;
&lt;li&gt;&lt;code&gt;azd ai agent show&lt;/code&gt; — mostra lo stato del container e la sua salute&lt;/li&gt;
&lt;li&gt;&lt;code&gt;azd ai agent monitor&lt;/code&gt; — trasmette i log del container in tempo reale&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Prima, testare un agente IA significava fare deploy su Microsoft Foundry ogni volta che facevi un cambiamento. Ora puoi iterare localmente, testare il comportamento del tuo agente, e fare deploy solo quando sei pronto.&lt;/p&gt;
&lt;h2 id="github-copilot-configura-il-tuo-progetto-azd"&gt;GitHub Copilot configura il tuo progetto azd&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;azd init&lt;/code&gt; ora offre un&amp;rsquo;opzione &amp;ldquo;Set up with GitHub Copilot (Preview)&amp;rdquo;. Invece di rispondere manualmente ai prompt, un agente Copilot genera la configurazione per te. Quando un comando fallisce, &lt;code&gt;azd&lt;/code&gt; offre troubleshooting assistito dall&amp;rsquo;IA — tutto senza lasciare il terminale.&lt;/p&gt;
&lt;h2 id="container-app-jobs-e-miglioramenti-del-deployment"&gt;Container App Jobs e miglioramenti del deployment&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Container App Jobs&lt;/strong&gt;: &lt;code&gt;azd&lt;/code&gt; ora fa deploy di &lt;code&gt;Microsoft.App/jobs&lt;/code&gt; tramite la config esistente &lt;code&gt;host: containerapp&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Timeout configurabili&lt;/strong&gt;: Nuovo flag &lt;code&gt;--timeout&lt;/code&gt; su &lt;code&gt;azd deploy&lt;/code&gt; e campo &lt;code&gt;deployTimeout&lt;/code&gt; in &lt;code&gt;azure.yaml&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fallback di build remoto&lt;/strong&gt;: Quando il build ACR fallisce, &lt;code&gt;azd&lt;/code&gt; passa automaticamente a Docker/Podman locale.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Validazione preflight locale&lt;/strong&gt;: I parametri Bicep vengono validati localmente prima del deploy.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="miglioramenti-dx"&gt;Miglioramenti DX&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Rilevamento automatico pnpm/yarn&lt;/strong&gt; per progetti JS/TS&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Supporto pyproject.toml&lt;/strong&gt; per Python&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Directory template locali&lt;/strong&gt; — &lt;code&gt;azd init --template&lt;/code&gt; accetta percorsi del filesystem&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Messaggi di errore migliori&lt;/strong&gt; in modalità &lt;code&gt;--no-prompt&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Variabili d&amp;rsquo;ambiente di build&lt;/strong&gt; iniettate in tutti i sottoprocessi di build (.NET, Node.js, Java, Python)&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id="per-concludere"&gt;Per concludere&lt;/h2&gt;
&lt;p&gt;Il loop locale di debug per agenti IA è la star di questa release, ma l&amp;rsquo;accumulo di miglioramenti al deployment e alla DX rende &lt;code&gt;azd&lt;/code&gt; più maturo che mai. Se fai deploy di app .NET su Azure — specialmente agenti IA — questo aggiornamento vale la pena.&lt;/p&gt;
&lt;p&gt;Consulta le &lt;a href="https://devblogs.microsoft.com/azure-sdk/azure-developer-cli-azd-march-2026/"&gt;note di rilascio complete&lt;/a&gt; per tutti i dettagli.&lt;/p&gt;</content:encoded></item><item><title>L'aggiornamento di marzo di Visual Studio permette di creare agenti Copilot personalizzati — e find_symbol è rivoluzionario</title><link>https://thedotnetblog.com/it/news/emiliano-montesdeoca/visual-studio-march-2026-custom-copilot-agents/</link><pubDate>Thu, 02 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/it/news/emiliano-montesdeoca/visual-studio-march-2026-custom-copilot-agents/</guid><description>L'aggiornamento di marzo 2026 di Visual Studio porta agenti Copilot personalizzati, skill riutilizzabili, lo strumento find_symbol con riconoscimento del linguaggio, e profiling con Copilot dal Test Explorer.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Questo post è stato tradotto automaticamente. Per la versione originale, &lt;a href="https://thedotnetblog.com/it/news/emiliano-montesdeoca/visual-studio-march-2026-custom-copilot-agents/"&gt;clicca qui&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Visual Studio ha appena ricevuto il suo aggiornamento Copilot più significativo. Mark Downie &lt;a href="https://devblogs.microsoft.com/visualstudio/visual-studio-march-update-build-your-own-custom-agents/"&gt;ha annunciato il rilascio di marzo&lt;/a&gt;, e il titolo sono gli agenti personalizzati — ma onestamente, lo strumento &lt;code&gt;find_symbol&lt;/code&gt; potrebbe essere la funzionalità che cambia di più il tuo workflow.&lt;/p&gt;
&lt;h2 id="agenti-copilot-personalizzati-nel-tuo-repo"&gt;Agenti Copilot personalizzati nel tuo repo&lt;/h2&gt;
&lt;p&gt;Vuoi che Copilot segua gli standard del tuo team? Gli agenti personalizzati sono definiti come file &lt;code&gt;.agent.md&lt;/code&gt; in &lt;code&gt;.github/agents/&lt;/code&gt;. Ogni agente ha accesso completo al workspace, comprensione del codice, strumenti, il tuo modello preferito e connessioni MCP.&lt;/p&gt;
&lt;h2 id="agent-skill-pacchetti-di-istruzioni-riutilizzabili"&gt;Agent skill: pacchetti di istruzioni riutilizzabili&lt;/h2&gt;
&lt;p&gt;Le skill vengono caricate automaticamente da &lt;code&gt;.github/skills/&lt;/code&gt; nel tuo repo o &lt;code&gt;~/.copilot/skills/&lt;/code&gt; nel tuo profilo.&lt;/p&gt;
&lt;h2 id="find_symbol-navigazione-consapevole-del-linguaggio"&gt;find_symbol: navigazione consapevole del linguaggio&lt;/h2&gt;
&lt;p&gt;Il nuovo strumento &lt;code&gt;find_symbol&lt;/code&gt; dà alla modalità agente di Copilot una navigazione dei simboli basata sui servizi di linguaggio. Invece di cercare testo, l&amp;rsquo;agente può trovare tutti i riferimenti di un simbolo e accedere a informazioni su tipi e scope.&lt;/p&gt;
&lt;p&gt;Per gli sviluppatori .NET, è un miglioramento enorme — i codebase C# con gerarchie di tipi profonde ne beneficiano enormemente.&lt;/p&gt;
&lt;h2 id="profilare-test-con-copilot"&gt;Profilare test con Copilot&lt;/h2&gt;
&lt;p&gt;C&amp;rsquo;è un nuovo &lt;strong&gt;Profile with Copilot&lt;/strong&gt; nel menu contestuale del Test Explorer. Il Profiling Agent esegue il test e analizza le performance automaticamente.&lt;/p&gt;
&lt;h2 id="perf-tip-durante-il-debug-dal-vivo"&gt;Perf tip durante il debug dal vivo&lt;/h2&gt;
&lt;p&gt;L&amp;rsquo;ottimizzazione delle performance ora avviene durante il debug. Visual Studio mostra il tempo di esecuzione inline. Linea lenta? Clicca sul Perf Tip e chiedi a Copilot suggerimenti.&lt;/p&gt;
&lt;h2 id="correggere-vulnerabilità-nuget-dal-solution-explorer"&gt;Correggere vulnerabilità NuGet dal Solution Explorer&lt;/h2&gt;
&lt;p&gt;Un link &lt;strong&gt;Fix with GitHub Copilot&lt;/strong&gt; appare direttamente nel Solution Explorer quando viene rilevata una vulnerabilità.&lt;/p&gt;
&lt;h2 id="per-concludere"&gt;Per concludere&lt;/h2&gt;
&lt;p&gt;Agenti personalizzati e skill fanno il titolo, ma &lt;code&gt;find_symbol&lt;/code&gt; è la gemma nascosta — cambia fondamentalmente la precisione di Copilot nel refactoring di codice .NET. Scarica &lt;a href="https://visualstudio.microsoft.com/downloads/"&gt;Visual Studio 2026 Insiders&lt;/a&gt; per provare tutto.&lt;/p&gt;</content:encoded></item><item><title>La Dashboard di Aspire 13.2 ora ha un'API di telemetria — e cambia tutto</title><link>https://thedotnetblog.com/it/news/emiliano-montesdeoca/aspire-132-dashboard-export-telemetry/</link><pubDate>Thu, 02 Apr 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/it/news/emiliano-montesdeoca/aspire-132-dashboard-export-telemetry/</guid><description>.NET Aspire 13.2 porta un'esportazione telemetrica più intelligente, un'API programmabile per trace e log, e miglioramenti alla visualizzazione GenAI. Ecco perché è importante per il tuo flusso di debug.</description><content:encoded>&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Questo post è stato tradotto automaticamente. Per la versione originale, &lt;a href="https://thedotnetblog.com/it/news/emiliano-montesdeoca/aspire-132-dashboard-export-telemetry/"&gt;clicca qui&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Se hai sviluppato applicazioni distribuite con .NET Aspire, sai già che la dashboard è la cosa migliore dell&amp;rsquo;intera esperienza. Tutti i tuoi trace, log e metriche in un unico posto — niente Jaeger esterno, niente configurazione di Seq, niente momenti &amp;ldquo;fammi controllare l&amp;rsquo;altro terminale&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;Aspire 13.2 ha appena migliorato tutto significativamente. James Newton-King &lt;a href="https://devblogs.microsoft.com/aspire/aspire-dashboard-improvements-export-and-telemetry/"&gt;ha annunciato l&amp;rsquo;aggiornamento&lt;/a&gt;, e onestamente? Le funzionalità di esportazione telemetria e l&amp;rsquo;API da sole giustificano l&amp;rsquo;upgrade.&lt;/p&gt;
&lt;h2 id="esportare-telemetria-come-una-persona-normale"&gt;Esportare telemetria come una persona normale&lt;/h2&gt;
&lt;p&gt;Ecco lo scenario che abbiamo vissuto tutti: stai debuggando un problema distribuito, finalmente lo riproduci dopo venti minuti di setup, e ora devi condividere con il team quello che è successo. Prima? Screenshot. Copia e incolla degli ID delle trace. Il solito caos.&lt;/p&gt;
&lt;p&gt;Aspire 13.2 aggiunge un dialog &lt;strong&gt;Gestisci log e telemetria&lt;/strong&gt; dove puoi:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Pulire tutta la telemetria (utile prima di un tentativo di riproduzione)&lt;/li&gt;
&lt;li&gt;Esportare telemetria selezionata in un file ZIP nel formato standard OTLP/JSON&lt;/li&gt;
&lt;li&gt;Re-importare quel ZIP in qualsiasi dashboard Aspire successivamente&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Quest&amp;rsquo;ultimo punto è la funzionalità killer. Riproduci un bug, esporti la telemetria, la alleghi al tuo work item, e il tuo collega può importarla nella propria dashboard per vedere esattamente quello che hai visto tu. Niente più &amp;ldquo;riesci a riprodurlo sulla tua macchina?&amp;rdquo;&lt;/p&gt;
&lt;p&gt;Trace, span e log individuali hanno anche un&amp;rsquo;opzione &amp;ldquo;Export JSON&amp;rdquo; nei menu contestuali. Devi condividere una trace specifica? Click destro, copia JSON, incolla nella descrizione della PR. Fatto.&lt;/p&gt;
&lt;h2 id="lapi-di-telemetria-è-il-vero-punto-di-svolta"&gt;L&amp;rsquo;API di telemetria è il vero punto di svolta&lt;/h2&gt;
&lt;p&gt;Questo è ciò che mi entusiasma di più. La dashboard ora espone un&amp;rsquo;API HTTP sotto &lt;code&gt;/api/telemetry&lt;/code&gt; per interrogare i dati di telemetria programmaticamente. Endpoint disponibili:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;GET /api/telemetry/resources&lt;/code&gt; — elencare risorse con telemetria&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GET /api/telemetry/spans&lt;/code&gt; — interrogare span con filtri&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GET /api/telemetry/logs&lt;/code&gt; — interrogare log con filtri&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GET /api/telemetry/traces&lt;/code&gt; — elencare trace&lt;/li&gt;
&lt;li&gt;&lt;code&gt;GET /api/telemetry/traces/{traceId}&lt;/code&gt; — ottenere tutti gli span per una trace specifica&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Tutto torna in formato OTLP JSON. Questo alimenta i nuovi comandi CLI &lt;code&gt;aspire agent mcp&lt;/code&gt; e &lt;code&gt;aspire otel&lt;/code&gt;, ma l&amp;rsquo;implicazione reale è più grande: ora puoi costruire strumenti, script e integrazioni con agenti IA che interrogano direttamente la telemetria della tua app.&lt;/p&gt;
&lt;p&gt;Immagina un agente IA che può vedere le tue trace distribuite reali durante il debug. Non è più ipotetico — è ciò che questa API rende possibile.&lt;/p&gt;
&lt;h2 id="la-telemetria-genai-diventa-pratica"&gt;La telemetria GenAI diventa pratica&lt;/h2&gt;
&lt;p&gt;Se stai costruendo app con IA usando Semantic Kernel o Microsoft.Extensions.AI, apprezzerai il visualizzatore di telemetria GenAI migliorato. Aspire 13.2 aggiunge:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Descrizioni degli strumenti IA renderizzate come Markdown&lt;/li&gt;
&lt;li&gt;Un pulsante GenAI dedicato nella pagina delle trace per accesso rapido&lt;/li&gt;
&lt;li&gt;Migliore gestione errori per JSON GenAI troncato o non standard&lt;/li&gt;
&lt;li&gt;Navigazione click-to-highlight tra le definizioni degli strumenti&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Il post menziona che VS Code Copilot chat, Copilot CLI e OpenCode supportano tutti la configurazione di un &lt;code&gt;OTEL_EXPORTER_OTLP_ENDPOINT&lt;/code&gt;. Puntali alla dashboard Aspire e puoi letteralmente guardare i tuoi agenti IA pensare in tempo reale attraverso la telemetria. Questa è un&amp;rsquo;esperienza di debug che non troverai da nessun&amp;rsquo;altra parte.&lt;/p&gt;
&lt;h2 id="per-concludere"&gt;Per concludere&lt;/h2&gt;
&lt;p&gt;Aspire 13.2 trasforma la dashboard da &amp;ldquo;bella UI di debug&amp;rdquo; a &amp;ldquo;piattaforma di osservabilità programmabile&amp;rdquo;. Il flusso di esportazione/importazione da solo fa risparmiare tempo reale nel debug distribuito, e l&amp;rsquo;API di telemetria apre la porta alla diagnostica assistita dall&amp;rsquo;IA.&lt;/p&gt;
&lt;p&gt;Se sei già su Aspire, aggiorna. Se no — questa è una buona ragione per dare un&amp;rsquo;occhiata a &lt;a href="https://aspire.dev"&gt;aspire.dev&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title>KubeCon Europe 2026: Cosa dovrebbero davvero sapere gli sviluppatori .NET</title><link>https://thedotnetblog.com/it/news/emiliano-montesdeoca/kubecon-2026-aks-updates-dotnet-developers/</link><pubDate>Sun, 29 Mar 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/it/news/emiliano-montesdeoca/kubecon-2026-aks-updates-dotnet-developers/</guid><description>Microsoft ha rilasciato una valanga di annunci Kubernetes alla KubeCon Europe 2026. Ecco la versione filtrata — solo gli aggiornamenti AKS e cloud-native che contano se sviluppi app .NET.</description><content:encoded>&lt;p&gt;&lt;em&gt;Questo post è stato tradotto automaticamente. Per la versione originale, &lt;a href="https://thedotnetblog.com/it/news/emiliano-montesdeoca/kubecon-2026-aks-updates-dotnet-developers/"&gt;clicca qui&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Conosci quella sensazione quando esce un post di annunci enorme e scrolli pensando &amp;ldquo;bello, ma cosa cambia davvero per me&amp;rdquo;? Mi succede ogni stagione KubeCon.&lt;/p&gt;
&lt;p&gt;Microsoft ha appena pubblicato il &lt;a href="https://opensource.microsoft.com/blog/2026/03/24/whats-new-with-microsoft-in-open-source-and-kubernetes-at-kubecon-cloudnativecon-europe-2026/"&gt;riassunto completo di KubeCon Europe 2026&lt;/a&gt; — scritto da Brendan Burns in persona — e onestamente? C&amp;rsquo;è sostanza vera. Non solo checklist di feature, ma miglioramenti operativi che cambiano come gestisci le cose in produzione.&lt;/p&gt;
&lt;p&gt;Vediamo cosa conta davvero per noi sviluppatori .NET.&lt;/p&gt;
&lt;h2 id="mtls-senza-la-tassa-del-service-mesh"&gt;mTLS senza la tassa del service mesh&lt;/h2&gt;
&lt;p&gt;Il punto sui service mesh: tutti vogliono le garanzie di sicurezza, nessuno vuole il carico operativo. AKS sta finalmente colmando questo divario.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://aka.ms/aks/application-network"&gt;Azure Kubernetes Application Network&lt;/a&gt; ti dà mutual TLS, autorizzazione application-aware e telemetria del traffico — senza deployare un mesh pesante con sidecar. Combinato con &lt;a href="https://aka.ms/acns/cilium-mtls"&gt;Cilium mTLS in Advanced Container Networking Services&lt;/a&gt;, ottieni comunicazione crittografata pod-a-pod usando certificati X.509 e SPIRE per la gestione delle identità.&lt;/p&gt;
&lt;p&gt;Cosa significa in pratica: le tue API ASP.NET Core che parlano con worker in background, i tuoi servizi gRPC che si chiamano a vicenda — tutto crittografato e verificato a livello di rete, senza modifiche al codice applicativo. È enorme.&lt;/p&gt;
&lt;p&gt;Per i team che migrano da &lt;code&gt;ingress-nginx&lt;/code&gt;, c&amp;rsquo;è anche &lt;a href="https://aka.ms/aks/app-routing/gateway-api"&gt;Application Routing con Meshless Istio&lt;/a&gt; con supporto completo per Kubernetes Gateway API. Niente sidecar. Basato su standard. E hanno rilasciato strumenti &lt;code&gt;ingress2gateway&lt;/code&gt; per la migrazione incrementale.&lt;/p&gt;
&lt;h2 id="osservabilità-gpu-che-non-è-un-ripensamento"&gt;Osservabilità GPU che non è un ripensamento&lt;/h2&gt;
&lt;p&gt;Se stai eseguendo inferenza IA accanto ai tuoi servizi .NET (e siamo onesti, chi non sta iniziando?), probabilmente hai incontrato il punto cieco del monitoraggio GPU. Avevi dashboard fantastiche per CPU/memoria e poi&amp;hellip; niente per le GPU senza configurazione manuale degli exporter.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://aka.ms/aks/managed-gpu-metrics"&gt;AKS ora espone le metriche GPU nativamente&lt;/a&gt; in Prometheus e Grafana gestiti. Stesso stack, stesse dashboard, stessa pipeline di alerting. Nessun exporter custom, nessun agent di terze parti.&lt;/p&gt;
&lt;p&gt;Sul lato rete, hanno aggiunto visibilità per flusso per traffico HTTP, gRPC e Kafka con un&amp;rsquo;&lt;a href="https://learn.microsoft.com/en-us/azure/aks/container-network-observability-logs"&gt;esperienza Azure Monitor one-click&lt;/a&gt;. IP, porte, workload, direzione del flusso, decisioni di policy — tutto in dashboard integrate.&lt;/p&gt;
&lt;p&gt;E quella che mi ha fatto guardare due volte: &lt;a href="https://learn.microsoft.com/en-us/azure/aks/advanced-container-networking-services-overview"&gt;agentic container networking&lt;/a&gt; aggiunge un&amp;rsquo;interfaccia web dove puoi fare domande in linguaggio naturale sullo stato di rete del tuo cluster. &amp;ldquo;Perché il pod X non raggiunge il servizio Y?&amp;rdquo; → diagnostica read-only dalla telemetria live. Genuinamente utile alle 2 di notte.&lt;/p&gt;
&lt;h2 id="networking-cross-cluster-senza-bisogno-di-un-dottorato"&gt;Networking cross-cluster senza bisogno di un dottorato&lt;/h2&gt;
&lt;p&gt;Il multi-cluster Kubernetes storicamente è stato un&amp;rsquo;esperienza &amp;ldquo;porta la tua colla di rete&amp;rdquo;. Azure Kubernetes Fleet Manager ora offre &lt;a href="https://aka.ms/kubernetes-fleet/networking/cross-cluster"&gt;networking cross-cluster&lt;/a&gt; tramite Cilium cluster mesh gestito:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Connettività unificata tra cluster AKS&lt;/li&gt;
&lt;li&gt;Registro globale dei servizi per la scoperta cross-cluster&lt;/li&gt;
&lt;li&gt;Configurazione gestita centralmente, non ripetuta per cluster&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Se esegui microservizi .NET su più regioni per resilienza o compliance, questo sostituisce molto collante custom fragile. Il Servizio A in West Europe può scoprire e chiamare il Servizio B in East US attraverso il mesh, con policy di routing e sicurezza consistenti.&lt;/p&gt;
&lt;h2 id="aggiornamenti-che-non-richiedono-coraggio"&gt;Aggiornamenti che non richiedono coraggio&lt;/h2&gt;
&lt;p&gt;Siamo onesti — gli aggiornamenti Kubernetes in produzione sono stressanti. &amp;ldquo;Aggiornare e sperare&amp;rdquo; è stata la strategia de facto per troppi team, ed è la ragione principale per cui i cluster restano indietro con le versioni.&lt;/p&gt;
&lt;p&gt;Due nuove capacità cambiano questo:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Blue-green agent pool upgrade&lt;/strong&gt; creano un pool di nodi parallelo con la nuova configurazione. Valida il comportamento, sposta il traffico gradualmente e mantieni un percorso di rollback pulito. Niente più mutazioni in-place su nodi di produzione.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Agent pool rollback&lt;/strong&gt; permette di riportare un pool di nodi alla versione Kubernetes e all&amp;rsquo;immagine nodo precedenti dopo che un aggiornamento va storto — senza ricostruire il cluster.&lt;/p&gt;
&lt;p&gt;Insieme, danno finalmente agli operatori un vero controllo sul ciclo di vita degli aggiornamenti. Per i team .NET, questo è importante perché la velocità della piattaforma controlla direttamente quanto rapidamente puoi adottare nuovi runtime, patch di sicurezza e capacità di rete.&lt;/p&gt;
&lt;h2 id="i-workload-ia-diventano-cittadini-di-prima-classe-in-kubernetes"&gt;I workload IA diventano cittadini di prima classe in Kubernetes&lt;/h2&gt;
&lt;p&gt;Il lavoro upstream open-source è altrettanto importante. Dynamic Resource Allocation (DRA) è appena andato in GA in Kubernetes 1.36, rendendo lo scheduling GPU una feature di prima classe invece di un workaround.&lt;/p&gt;
&lt;p&gt;Alcuni progetti da tenere d&amp;rsquo;occhio:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Progetto&lt;/th&gt;
&lt;th&gt;Cosa fa&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/kaito-project/kubeairunway"&gt;AI Runway&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;API Kubernetes comune per l&amp;rsquo;inferenza — deploy di modelli senza conoscere K8s, con scoperta HuggingFace e stime dei costi&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://www.cncf.io/blog/2026/01/07/holmesgpt-agentic-troubleshooting-built-for-the-cloud-native-era/"&gt;HolmesGPT&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Troubleshooting agentico per il cloud-native — ora un progetto CNCF Sandbox&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;a href="https://github.com/project-dalec/dalec"&gt;Dalec&lt;/a&gt;&lt;/td&gt;
&lt;td&gt;Build dichiarativi di immagini container con generazione SBOM — meno CVE nella fase di build&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;La direzione è chiara: la tua API .NET, il tuo layer di orchestrazione con Semantic Kernel e i tuoi workload di inferenza dovrebbero tutti girare su un modello di piattaforma consistente. Ci stiamo arrivando.&lt;/p&gt;
&lt;h2 id="da-dove-partirei-questa-settimana"&gt;Da dove partirei questa settimana&lt;/h2&gt;
&lt;p&gt;Se stai valutando questi cambiamenti per il tuo team, ecco la mia lista onesta di priorità:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Osservabilità prima&lt;/strong&gt; — abilita le metriche GPU e i log di flusso di rete in un cluster non-prod. Guarda cosa ti sei perso.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Prova i blue-green upgrade&lt;/strong&gt; — testa il workflow di rollback prima del tuo prossimo aggiornamento di cluster in produzione. Costruisci fiducia nel processo.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pilota il networking identity-aware&lt;/strong&gt; — scegli un percorso di servizio interno e abilita mTLS con Cilium. Misura l&amp;rsquo;overhead (spoiler: è minimo).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Valuta Fleet Manager&lt;/strong&gt; — se gestisci più di due cluster, il networking cross-cluster si ripaga da solo in riduzione di collante custom.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Piccoli esperimenti, feedback veloce. È sempre la mossa giusta.&lt;/p&gt;
&lt;h2 id="per-concludere"&gt;Per concludere&lt;/h2&gt;
&lt;p&gt;Gli annunci KubeCon possono essere travolgenti, ma questa tornata muove davvero l&amp;rsquo;ago per i team .NET su AKS. Migliore sicurezza di rete senza overhead di mesh, vera osservabilità GPU, aggiornamenti più sicuri e fondamenta più solide per l&amp;rsquo;infrastruttura IA.&lt;/p&gt;
&lt;p&gt;Se sei già su AKS, è un ottimo momento per rafforzare la tua baseline operativa. E se stai pianificando di spostare workload .NET su Kubernetes — la piattaforma è appena diventata significativamente più pronta per la produzione.&lt;/p&gt;</content:encoded></item><item><title>Foundry Agent Service è GA: Cosa conta davvero per chi costruisce agenti .NET</title><link>https://thedotnetblog.com/it/news/emiliano-montesdeoca/foundry-agent-service-ga-what-matters/</link><pubDate>Thu, 26 Mar 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/it/news/emiliano-montesdeoca/foundry-agent-service-ga-what-matters/</guid><description>Il Foundry Agent Service di Microsoft è appena andato in GA con networking privato, Voice Live, valutazioni di produzione e un runtime multi-modello aperto. Ecco cosa devi sapere.</description><content:encoded>&lt;p&gt;Siamo onesti — costruire un prototipo di agente IA è la parte facile. La parte difficile è tutto quello che viene dopo: metterlo in produzione con un adeguato isolamento di rete, eseguire valutazioni che significhino davvero qualcosa, gestire i requisiti di conformità e non rompere nulla alle 2 di notte.&lt;/p&gt;
&lt;p&gt;Il &lt;a href="https://devblogs.microsoft.com/foundry/foundry-agent-service-ga/"&gt;Foundry Agent Service è appena andato in GA&lt;/a&gt;, e questo rilascio è focalizzato come un laser su quel gap del &amp;ldquo;tutto quello che viene dopo&amp;rdquo;.&lt;/p&gt;
&lt;h2 id="costruito-sulla-responses-api"&gt;Costruito sulla Responses API&lt;/h2&gt;
&lt;p&gt;Il titolo: il Foundry Agent Service di nuova generazione è costruito sulla OpenAI Responses API. Se stai già costruendo con quel wire protocol, migrare a Foundry richiede modifiche minime al codice. Cosa guadagni: sicurezza enterprise, networking privato, RBAC Entra, tracing completo e valutazione — sopra la tua logica di agente esistente.&lt;/p&gt;
&lt;p&gt;L&amp;rsquo;architettura è intenzionalmente aperta. Non sei vincolato a un provider di modelli o a un framework di orchestrazione. Usa DeepSeek per la pianificazione, OpenAI per la generazione, LangGraph per l&amp;rsquo;orchestrazione — il runtime gestisce il livello di consistenza.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;azure.ai.projects&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;AIProjectClient&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;azure.ai.projects.models&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;PromptAgentDefinition&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;with&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;DefaultAzureCredential&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;credential&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;AIProjectClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;endpoint&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;AZURE_AI_PROJECT_ENDPOINT&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;credential&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;credential&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;project_client&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;project_client&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get_openai_client&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="k"&gt;as&lt;/span&gt; &lt;span class="n"&gt;openai_client&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;):&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;agent&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;project_client&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;agents&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;create_version&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;agent_name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;my-enterprise-agent&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;definition&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;PromptAgentDefinition&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;model&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;AZURE_AI_MODEL_DEPLOYMENT_NAME&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;instructions&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;You are a helpful assistant.&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;conversation&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;openai_client&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;conversations&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;create&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;openai_client&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;responses&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;conversation&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;conversation&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;input&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;What are best practices for building AI agents?&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;extra_body&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;agent_reference&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;agent_reference&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;output_text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;blockquote&gt;
&lt;p&gt;Se vieni dal pacchetto &lt;code&gt;azure-ai-agents&lt;/code&gt;, gli agenti sono ora operazioni di prima classe su &lt;code&gt;AIProjectClient&lt;/code&gt; in &lt;code&gt;azure-ai-projects&lt;/code&gt;. Rimuovi la dipendenza standalone e usa &lt;code&gt;get_openai_client()&lt;/code&gt; per gestire le risposte.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="networking-privato-il-bloccante-enterprise-rimosso"&gt;Networking privato: il bloccante enterprise rimosso&lt;/h2&gt;
&lt;p&gt;Questa è la funzionalità che sblocca l&amp;rsquo;adozione enterprise. Foundry ora supporta networking privato completo end-to-end con BYO VNet:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Nessun egress pubblico&lt;/strong&gt; — il traffico dell&amp;rsquo;agente non tocca mai internet pubblico&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Iniezione di container/subnet&lt;/strong&gt; nella tua rete per comunicazione locale&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Connettività degli strumenti inclusa&lt;/strong&gt; — server MCP, Azure AI Search, agenti dati Fabric operano tutti su percorsi privati&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;L&amp;rsquo;ultimo punto è critico. Non sono solo le chiamate di inferenza a restare private — ogni invocazione di strumento e chiamata di retrieval resta anch&amp;rsquo;essa all&amp;rsquo;interno del perimetro della tua rete. Per i team che operano sotto policy di classificazione dei dati che vietano il routing esterno, questo era ciò che mancava.&lt;/p&gt;
&lt;h2 id="autenticazione-mcp-fatta-bene"&gt;Autenticazione MCP fatta bene&lt;/h2&gt;
&lt;p&gt;Le connessioni ai server MCP ora supportano l&amp;rsquo;intero spettro di pattern di autenticazione:&lt;/p&gt;
&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Metodo di auth&lt;/th&gt;
&lt;th&gt;Quando usarlo&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Basato su chiave&lt;/td&gt;
&lt;td&gt;Accesso condiviso semplice per strumenti interni all&amp;rsquo;organizzazione&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Entra Agent Identity&lt;/td&gt;
&lt;td&gt;Servizio a servizio; l&amp;rsquo;agente si autentica come se stesso&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Entra Managed Identity&lt;/td&gt;
&lt;td&gt;Isolamento per progetto; nessuna gestione delle credenziali&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;OAuth Identity Passthrough&lt;/td&gt;
&lt;td&gt;Accesso delegato dall&amp;rsquo;utente; l&amp;rsquo;agente agisce per conto degli utenti&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;OAuth Identity Passthrough è quello interessante. Quando gli utenti devono concedere a un agente l&amp;rsquo;accesso ai propri dati personali — il loro OneDrive, la loro organizzazione Salesforce, un&amp;rsquo;API SaaS con scope per utente — l&amp;rsquo;agente agisce per loro conto con flussi OAuth standard. Nessuna identità di sistema condivisa che finge di essere tutti.&lt;/p&gt;
&lt;h2 id="voice-live-voce-a-voce-senza-lidraulica"&gt;Voice Live: voce a voce senza l&amp;rsquo;idraulica&lt;/h2&gt;
&lt;p&gt;Aggiungere la voce a un agente significava unire STT, LLM e TTS — tre servizi, tre hop di latenza, tre superfici di fatturazione, tutto sincronizzato a mano. &lt;strong&gt;Voice Live&lt;/strong&gt; collassa tutto in una singola API gestita con:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Rilevamento semantico dell&amp;rsquo;attività vocale e del fine turno (capisce il significato, non solo il silenzio)&lt;/li&gt;
&lt;li&gt;Soppressione del rumore e cancellazione dell&amp;rsquo;eco lato server&lt;/li&gt;
&lt;li&gt;Supporto barge-in (gli utenti possono interrompere a metà risposta)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Le interazioni vocali passano attraverso lo stesso runtime dell&amp;rsquo;agente del testo. Stessi valutatori, stesse tracce, stessa visibilità dei costi. Per supporto clienti, servizio sul campo o scenari di accessibilità, questo sostituisce ciò che prima richiedeva una pipeline audio personalizzata.&lt;/p&gt;
&lt;h2 id="valutazioni-da-checkbox-a-monitoraggio-continuo"&gt;Valutazioni: da checkbox a monitoraggio continuo&lt;/h2&gt;
&lt;p&gt;Qui è dove Foundry diventa serio sulla qualità in produzione. Il sistema di valutazione ora ha tre livelli:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Valutatori pronti all&amp;rsquo;uso&lt;/strong&gt; — coerenza, rilevanza, fondatezza, qualità del retrieval, sicurezza. Connetti a un dataset o al traffico live e ottieni punteggi.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Valutatori personalizzati&lt;/strong&gt; — codifica la tua logica di business, standard di tono e regole di conformità specifiche del dominio.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;&lt;strong&gt;Valutazione continua&lt;/strong&gt; — Foundry campiona il traffico di produzione live, esegue la tua suite di valutatori e mostra i risultati nei dashboard. Imposta alert di Azure Monitor per quando la fondatezza cala o le soglie di sicurezza vengono superate.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Tutto viene pubblicato in Azure Monitor Application Insights. Qualità dell&amp;rsquo;agente, salute dell&amp;rsquo;infrastruttura, costi e telemetria dell&amp;rsquo;applicazione — tutto in un unico posto.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-python" data-lang="python"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;eval_object&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;openai_client&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;evals&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;create&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;Agent Quality Evaluation&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;data_source_config&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;DataSourceConfigCustom&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nb"&gt;type&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;custom&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;item_schema&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;object&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;properties&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;query&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;string&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;}},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;required&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;query&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;include_sample_schema&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;testing_criteria&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;azure_ai_evaluator&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;fluency&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;evaluator_name&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;builtin.fluency&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;initialization_parameters&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;deployment_name&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;environ&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;AZURE_AI_MODEL_DEPLOYMENT_NAME&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;data_mapping&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;query&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;{{item.query}}&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s2"&gt;&amp;#34;response&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;{{sample.output_text}}&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id="sei-nuove-regioni-per-agenti-ospitati"&gt;Sei nuove regioni per agenti ospitati&lt;/h2&gt;
&lt;p&gt;Gli agenti ospitati sono ora disponibili in East US, North Central US, Sweden Central, Southeast Asia, Japan East e altre. Questo conta per i requisiti di residenza dei dati e per comprimere la latenza quando il tuo agente gira vicino alle sue fonti dati.&lt;/p&gt;
&lt;h2 id="perché-è-importante-per-gli-sviluppatori-net"&gt;Perché è importante per gli sviluppatori .NET&lt;/h2&gt;
&lt;p&gt;Anche se gli esempi di codice nell&amp;rsquo;annuncio GA sono Python-first, l&amp;rsquo;infrastruttura sottostante è language-agnostic — e l&amp;rsquo;SDK .NET per &lt;code&gt;azure-ai-projects&lt;/code&gt; segue gli stessi pattern. La Responses API, il framework di valutazione, il networking privato, l&amp;rsquo;auth MCP — tutto questo è disponibile da .NET.&lt;/p&gt;
&lt;p&gt;Se stavi aspettando che gli agenti IA passassero da &amp;ldquo;demo cool&amp;rdquo; a &amp;ldquo;posso davvero consegnare questo al lavoro&amp;rdquo;, questo rilascio GA è il segnale. Networking privato, autenticazione adeguata, valutazione continua e monitoraggio di produzione sono i pezzi che mancavano.&lt;/p&gt;
&lt;h2 id="per-concludere"&gt;Per concludere&lt;/h2&gt;
&lt;p&gt;Foundry Agent Service è disponibile ora. Installa l&amp;rsquo;SDK, apri &lt;a href="https://ai.azure.com"&gt;il portale&lt;/a&gt; e inizia a costruire. La &lt;a href="https://learn.microsoft.com/azure/foundry/quickstarts/get-started-code"&gt;guida quickstart&lt;/a&gt; ti porta da zero a un agente funzionante in pochi minuti.&lt;/p&gt;
&lt;p&gt;Per il deep-dive tecnico completo con tutti gli esempi di codice, consulta l&amp;rsquo;&lt;a href="https://devblogs.microsoft.com/foundry/foundry-agent-service-ga/"&gt;annuncio GA&lt;/a&gt;.&lt;/p&gt;</content:encoded></item><item><title>Risposte in background nel Microsoft Agent Framework: basta ansia da timeout</title><link>https://thedotnetblog.com/it/news/emiliano-montesdeoca/background-responses-agent-framework-long-running-tasks/</link><pubDate>Thu, 26 Mar 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/it/news/emiliano-montesdeoca/background-responses-agent-framework-long-running-tasks/</guid><description>Microsoft Agent Framework ora permette di scaricare attività IA di lunga durata con token di continuazione. Ecco come funzionano le risposte in background e perché contano per i tuoi agenti .NET.</description><content:encoded>&lt;p&gt;Se hai costruito qualcosa con modelli di ragionamento come o3 o GPT-5.2, conosci il dolore. Il tuo agente inizia a ragionare su un compito complesso, il client resta in attesa, e da qualche parte tra &amp;ldquo;va tutto bene&amp;rdquo; e &amp;ldquo;si sarà bloccato?&amp;rdquo; la tua connessione va in timeout. Tutto quel lavoro? Perso.&lt;/p&gt;
&lt;p&gt;Microsoft Agent Framework ha appena rilasciato le &lt;a href="https://devblogs.microsoft.com/agent-framework/handling-long-running-operations-with-background-responses/"&gt;risposte in background&lt;/a&gt; — e onestamente, questa è una di quelle funzionalità che avrebbero dovuto esistere dal primo giorno.&lt;/p&gt;
&lt;h2 id="il-problema-con-le-chiamate-bloccanti"&gt;Il problema con le chiamate bloccanti&lt;/h2&gt;
&lt;p&gt;In un pattern tradizionale richiesta-risposta, il tuo client si blocca finché l&amp;rsquo;agente non finisce. Funziona bene per i compiti veloci. Ma quando chiedi a un modello di ragionamento di fare ricerca approfondita, analisi multi-step, o generare un report di 20 pagine? Stai guardando minuti di tempo reale. Durante quella finestra:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Le connessioni HTTP possono scadere&lt;/li&gt;
&lt;li&gt;I problemi di rete uccidono l&amp;rsquo;intera operazione&lt;/li&gt;
&lt;li&gt;Il tuo utente fissa uno spinner chiedendosi se sta succedendo qualcosa&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Le risposte in background ribaltano tutto questo.&lt;/p&gt;
&lt;h2 id="come-funzionano-i-token-di-continuazione"&gt;Come funzionano i token di continuazione&lt;/h2&gt;
&lt;p&gt;Invece di bloccare, lanci il compito dell&amp;rsquo;agente e ottieni un &lt;strong&gt;token di continuazione&lt;/strong&gt;. Pensalo come un biglietto di ritiro in un&amp;rsquo;officina — non resti al bancone ad aspettare, torni quando è pronto.&lt;/p&gt;
&lt;p&gt;Il flusso è diretto:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Invia la tua richiesta con &lt;code&gt;AllowBackgroundResponses = true&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Se l&amp;rsquo;agente supporta l&amp;rsquo;elaborazione in background, ricevi un token di continuazione&lt;/li&gt;
&lt;li&gt;Interroga al tuo ritmo finché il token non torna &lt;code&gt;null&lt;/code&gt; — significa che il risultato è pronto&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Ecco la versione .NET:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;AIAgent&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;AzureOpenAIClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Uri&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;https://&amp;lt;myresource&amp;gt;.openai.azure.com&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;DefaultAzureCredential&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GetResponsesClient&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;&amp;#34;&amp;lt;deployment-name&amp;gt;&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;AsAIAgent&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;AgentRunOptions&lt;/span&gt; &lt;span class="n"&gt;options&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;AllowBackgroundResponses&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;AgentSession&lt;/span&gt; &lt;span class="n"&gt;session&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CreateSessionAsync&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;AgentResponse&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;RunAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s"&gt;&amp;#34;Write a detailed market analysis for the Q4 product launch.&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// Interrogare fino al completamento&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ContinuationToken&lt;/span&gt; &lt;span class="k"&gt;is&lt;/span&gt; &lt;span class="n"&gt;not&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;Task&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Delay&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;TimeSpan&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;FromSeconds&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ContinuationToken&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ContinuationToken&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;RunAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Se l&amp;rsquo;agente completa immediatamente (compiti semplici, modelli che non necessitano di elaborazione in background), nessun token viene restituito. Il tuo codice funziona e basta — nessuna gestione speciale necessaria.&lt;/p&gt;
&lt;h2 id="streaming-con-ripresa-la-vera-magia"&gt;Streaming con ripresa: la vera magia&lt;/h2&gt;
&lt;p&gt;Il polling va bene per scenari fire-and-forget, ma cosa succede quando vuoi il progresso in tempo reale? Le risposte in background supportano anche lo streaming con ripresa integrata.&lt;/p&gt;
&lt;p&gt;Ogni aggiornamento dello stream porta il suo token di continuazione. Se la tua connessione cade a metà stream, riprendi esattamente da dove avevi lasciato:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-csharp" data-lang="csharp"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;AgentRunOptions&lt;/span&gt; &lt;span class="n"&gt;options&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;AllowBackgroundResponses&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;};&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;AgentSession&lt;/span&gt; &lt;span class="n"&gt;session&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;CreateSessionAsync&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;AgentResponseUpdate&lt;/span&gt;&lt;span class="p"&gt;?&lt;/span&gt; &lt;span class="n"&gt;latestUpdate&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;null&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;update&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;RunStreamingAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="s"&gt;&amp;#34;Write a detailed market analysis for the Q4 product launch.&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;latestUpdate&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="k"&gt;break&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="c1"&gt;// Simulare un&amp;#39;interruzione di rete&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="c1"&gt;// Riprendere esattamente da dove avevamo lasciato&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;ContinuationToken&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;latestUpdate&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="n"&gt;ContinuationToken&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="k"&gt;foreach&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="kt"&gt;var&lt;/span&gt; &lt;span class="n"&gt;update&lt;/span&gt; &lt;span class="k"&gt;in&lt;/span&gt; &lt;span class="n"&gt;agent&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;RunStreamingAsync&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;session&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;options&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;update&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Text&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;L&amp;rsquo;agente continua a elaborare lato server indipendentemente da cosa succede al tuo client. È tolleranza ai guasti integrata senza che tu scriva logica di retry o circuit breaker.&lt;/p&gt;
&lt;h2 id="quando-usare-questo-concretamente"&gt;Quando usare questo concretamente&lt;/h2&gt;
&lt;p&gt;Non ogni chiamata all&amp;rsquo;agente ha bisogno di risposte in background. Per completamenti veloci, stai aggiungendo complessità senza motivo. Ma ecco dove brillano:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Compiti di ragionamento complesso&lt;/strong&gt; — analisi multi-step, ricerca approfondita, qualsiasi cosa che faccia davvero pensare un modello di ragionamento&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Generazione di contenuti lunghi&lt;/strong&gt; — report dettagliati, documenti multi-parte, analisi estese&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Reti poco affidabili&lt;/strong&gt; — client mobili, deployment edge, VPN aziendali instabili&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Pattern UX asincroni&lt;/strong&gt; — invia un compito, vai a fare altro, torna per i risultati&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Per noi sviluppatori .NET che costruiamo app enterprise, l&amp;rsquo;ultimo punto è particolarmente interessante. Pensa a un&amp;rsquo;app Blazor dove un utente richiede un report complesso — lanci il compito dell&amp;rsquo;agente, mostri un indicatore di progresso, e li lasci continuare a lavorare. Niente acrobazie WebSocket, niente infrastruttura di code personalizzata, solo un token e un loop di polling.&lt;/p&gt;
&lt;h2 id="per-concludere"&gt;Per concludere&lt;/h2&gt;
&lt;p&gt;Le risposte in background sono disponibili ora sia in .NET che in Python attraverso Microsoft Agent Framework. Se stai costruendo agenti che fanno qualcosa di più complesso del semplice Q&amp;amp;A, vale la pena aggiungerlo al tuo toolkit. Il pattern del token di continuazione mantiene le cose semplici risolvendo un problema di produzione molto reale.&lt;/p&gt;
&lt;p&gt;Consulta la &lt;a href="https://devblogs.microsoft.com/agent-framework/handling-long-running-operations-with-background-responses/"&gt;documentazione completa&lt;/a&gt; per il riferimento completo dell&amp;rsquo;API e altri esempi.&lt;/p&gt;</content:encoded></item><item><title>VS Code 1.112: Cosa dovrebbe davvero interessare agli sviluppatori .NET</title><link>https://thedotnetblog.com/it/news/emiliano-montesdeoca/vscode-1-112-dotnet-developers/</link><pubDate>Thu, 26 Mar 2026 00:00:00 +0000</pubDate><author>Emiliano Montesdeoca</author><guid>https://thedotnetblog.com/it/news/emiliano-montesdeoca/vscode-1-112-dotnet-developers/</guid><description>VS Code 1.112 è appena uscito ed è pieno di upgrade per gli agenti, un debugger browser integrato, sandboxing MCP e supporto monorepo. Ecco cosa conta davvero se sviluppi con .NET.</description><content:encoded>&lt;p&gt;VS Code 1.112 è appena atterrato, e onestamente? Questo colpisce diversamente se passi le tue giornate nel mondo .NET. C&amp;rsquo;è molto nelle &lt;a href="https://code.visualstudio.com/updates/v1_112"&gt;note di rilascio ufficiali&lt;/a&gt;, ma lascia che ti risparmi un po&amp;rsquo; di scrolling e mi concentri su quello che conta davvero per noi.&lt;/p&gt;
&lt;h2 id="copilot-cli-è-diventato-molto-più-utile"&gt;Copilot CLI è diventato molto più utile&lt;/h2&gt;
&lt;p&gt;Il grande tema di questo rilascio è l&amp;rsquo;&lt;strong&gt;autonomia dell&amp;rsquo;agente&lt;/strong&gt; — dare a Copilot più spazio per fare il suo lavoro senza che tu supervisioni ogni passo.&lt;/p&gt;
&lt;h3 id="steering-e-coda-dei-messaggi"&gt;Steering e coda dei messaggi&lt;/h3&gt;
&lt;p&gt;Conosci quel momento in cui Copilot CLI è a metà di un task e ti rendi conto che hai dimenticato di menzionare qualcosa? Prima, dovevi aspettare. Ora puoi inviare messaggi mentre una richiesta è ancora in corso — sia per dirigere la risposta corrente che per mettere in coda istruzioni di follow-up.&lt;/p&gt;
&lt;p&gt;Questo è enorme per quei task di scaffolding &lt;code&gt;dotnet&lt;/code&gt; più lunghi dove stai guardando Copilot configurare un progetto e pensi &amp;ldquo;oh aspetta, mi serve anche MassTransit lì dentro.&amp;rdquo;&lt;/p&gt;
&lt;h3 id="livelli-di-permessi"&gt;Livelli di permessi&lt;/h3&gt;
&lt;p&gt;Questo è quello che mi entusiasma di più. Le sessioni Copilot CLI ora supportano tre livelli di permessi:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Permessi predefiniti&lt;/strong&gt; — il flusso solito dove gli strumenti chiedono conferma prima di eseguire&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Bypass approvazioni&lt;/strong&gt; — auto-approva tutto e riprova in caso di errore&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Autopilota&lt;/strong&gt; — completamente autonomo: approva strumenti, risponde alle proprie domande e continua finché il task non è completo&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Se stai facendo qualcosa come creare una nuova API ASP.NET Core con Entity Framework, migrazioni e Docker setup — la modalità Autopilota significa che descrivi quello che vuoi e vai a prendere un caffè. Lo capirà da solo.&lt;/p&gt;
&lt;p&gt;Puoi abilitare l&amp;rsquo;Autopilota con l&amp;rsquo;impostazione &lt;code&gt;chat.autopilot.enabled&lt;/code&gt;.&lt;/p&gt;
&lt;h3 id="anteprima-delle-modifiche-prima-della-delega"&gt;Anteprima delle modifiche prima della delega&lt;/h3&gt;
&lt;p&gt;Quando deleghi un task a Copilot CLI, crea un worktree. Prima, se avevi modifiche non committate, dovevi controllare il Source Control per vedere cosa sarebbe stato influenzato. Ora la vista Chat mostra le modifiche pendenti proprio lì prima che tu decida se copiarle, spostarle o ignorarle.&lt;/p&gt;
&lt;p&gt;Piccola cosa, ma ti salva da quel momento &amp;ldquo;aspetta, cosa avevo in staging?&amp;rdquo;&lt;/p&gt;
&lt;h2 id="debug-delle-web-app-senza-lasciare-vs-code"&gt;Debug delle web app senza lasciare VS Code&lt;/h2&gt;
&lt;p&gt;Il browser integrato ora supporta il &lt;strong&gt;debugging completo&lt;/strong&gt;. Puoi impostare breakpoint, fare step through del codice e ispezionare variabili — tutto dentro VS Code. Basta passare a Edge DevTools.&lt;/p&gt;
&lt;p&gt;C&amp;rsquo;è un nuovo tipo di debug &lt;code&gt;editor-browser&lt;/code&gt;, e se hai già configurazioni di lancio &lt;code&gt;msedge&lt;/code&gt; o &lt;code&gt;chrome&lt;/code&gt; esistenti, migrare è semplice come cambiare il campo &lt;code&gt;type&lt;/code&gt; nel tuo &lt;code&gt;launch.json&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;type&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;editor-browser&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;request&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;launch&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;name&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;Debug Blazor App&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;url&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;https://localhost:5001&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Per gli sviluppatori Blazor, questo è un game changer. Stai già eseguendo &lt;code&gt;dotnet watch&lt;/code&gt; nel terminale — ora anche il tuo debugging resta nella stessa finestra.&lt;/p&gt;
&lt;p&gt;Il browser ha anche ottenuto livelli di zoom indipendenti (finalmente), menu contestuali con clic destro appropriati, e lo zoom viene ricordato per sito web.&lt;/p&gt;
&lt;h2 id="sandboxing-dei-server-mcp"&gt;Sandboxing dei server MCP&lt;/h2&gt;
&lt;p&gt;Questo conta più di quanto potresti pensare. Se usi server MCP — magari ne hai configurato uno personalizzato per le tue risorse Azure o query al database — giravano con gli stessi permessi del tuo processo VS Code. Questo significa accesso completo al tuo filesystem, rete, tutto.&lt;/p&gt;
&lt;p&gt;Ora puoi metterli in sandbox. Nel tuo &lt;code&gt;mcp.json&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;servers&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;my-azure-tools&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;command&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;#34;node&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;args&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;#34;./mcp-server.js&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;sandboxEnabled&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Quando un server sandboxato ha bisogno di accedere a qualcosa che non ha, VS Code ti chiede di concedere il permesso. Molto meglio dell&amp;rsquo;approccio &amp;ldquo;speriamo che nessuno faccia nulla di strano&amp;rdquo;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Nota:&lt;/strong&gt; Il sandboxing è disponibile su macOS e Linux per ora. Il supporto Windows è in arrivo — scenari remoti come WSL funzionano però.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h2 id="scoperta-delle-personalizzazioni-nei-monorepo"&gt;Scoperta delle personalizzazioni nei monorepo&lt;/h2&gt;
&lt;p&gt;Se lavori in un monorepo (e siamo onesti, molte soluzioni .NET enterprise finiscono per diventarne uno), questo risolve un vero punto dolente.&lt;/p&gt;
&lt;p&gt;Prima, se aprivi una sottocartella del tuo repo, VS Code non trovava il tuo &lt;code&gt;copilot-instructions.md&lt;/code&gt;, &lt;code&gt;AGENTS.md&lt;/code&gt; o skills personalizzati alla radice del repository. Ora con l&amp;rsquo;impostazione &lt;code&gt;chat.useCustomizationsInParentRepositories&lt;/code&gt;, risale fino alla radice &lt;code&gt;.git&lt;/code&gt; e scopre tutto.&lt;/p&gt;
&lt;p&gt;Questo significa che il tuo team può condividere istruzioni per agenti, file di prompt e strumenti personalizzati tra tutti i progetti in un monorepo senza che tutti debbano aprire la cartella radice.&lt;/p&gt;
&lt;h2 id="troubleshoot-per-il-debugging-degli-agenti"&gt;/troubleshoot per il debugging degli agenti&lt;/h2&gt;
&lt;p&gt;Hai mai configurato istruzioni personalizzate o skills e ti sei chiesto perché non vengono rilevati? Il nuovo skill &lt;code&gt;/troubleshoot&lt;/code&gt; legge i log di debug dell&amp;rsquo;agente e ti dice cosa è successo — quali strumenti sono stati usati o saltati, perché le istruzioni non sono state caricate, e cosa sta causando risposte lente.&lt;/p&gt;
&lt;p&gt;Abilitalo con:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" class="chroma"&gt;&lt;code class="language-json" data-lang="json"&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;{&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;github.copilot.chat.agentDebugLog.enabled&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt; &lt;span class="nt"&gt;&amp;#34;github.copilot.chat.agentDebugLog.fileLogging.enabled&amp;#34;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="kc"&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class="line"&gt;&lt;span class="cl"&gt;&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Poi scrivi semplicemente &lt;code&gt;/troubleshoot why is my custom skill not loading?&lt;/code&gt; nella chat.&lt;/p&gt;
&lt;p&gt;Puoi anche esportare e importare questi log di debug ora, il che è ottimo per condividerli con il team quando qualcosa non funziona come previsto.&lt;/p&gt;
&lt;h2 id="supporto-file-immagine-e-binari"&gt;Supporto file immagine e binari&lt;/h2&gt;
&lt;p&gt;Gli agenti possono ora leggere file immagine dal disco e file binari nativamente. I file binari vengono presentati in formato hexdump, e gli output delle immagini (come screenshot dal browser integrato) appaiono in una vista carousel.&lt;/p&gt;
&lt;p&gt;Per gli sviluppatori .NET, pensa: incolla uno screenshot di un bug UI nella chat e fai capire all&amp;rsquo;agente cosa c&amp;rsquo;è che non va, o fagli analizzare l&amp;rsquo;output del rendering di un componente Blazor.&lt;/p&gt;
&lt;h2 id="riferimenti-automatici-ai-simboli"&gt;Riferimenti automatici ai simboli&lt;/h2&gt;
&lt;p&gt;Piccolo miglioramento di qualità della vita: quando copi il nome di un simbolo (una classe, metodo, ecc.) e lo incolli nella chat, VS Code ora lo converte automaticamente in un riferimento &lt;code&gt;#sym:Name&lt;/code&gt;. Questo dà all&amp;rsquo;agente il contesto completo su quel simbolo senza che tu debba aggiungerlo manualmente.&lt;/p&gt;
&lt;p&gt;Se vuoi testo semplice, usa &lt;code&gt;Ctrl+Shift+V&lt;/code&gt;.&lt;/p&gt;
&lt;h2 id="i-plugin-possono-ora-essere-abilitatidisabilitati"&gt;I plugin possono ora essere abilitati/disabilitati&lt;/h2&gt;
&lt;p&gt;Prima, disabilitare un server MCP o plugin significava disinstallarlo. Ora puoi attivarli e disattivarli — sia globalmente che per workspace. Clic destro nella vista Estensioni o nella vista Personalizzazioni e hai fatto.&lt;/p&gt;
&lt;p&gt;I plugin da npm e pypi possono anche auto-aggiornarsi ora, anche se chiederanno approvazione prima poiché gli aggiornamenti significano eseguire nuovo codice sulla tua macchina.&lt;/p&gt;
&lt;h2 id="per-concludere"&gt;Per concludere&lt;/h2&gt;
&lt;p&gt;VS Code 1.112 sta chiaramente spingendo forte sull&amp;rsquo;esperienza agent — più autonomia, debugging migliore, sicurezza più stretta. Per gli sviluppatori .NET, il debugging del browser integrato e i miglioramenti di Copilot CLI sono le funzionalità di punta.&lt;/p&gt;
&lt;p&gt;Se non hai ancora provato a eseguire una sessione completa di Copilot CLI in modalità Autopilota per un progetto .NET, questo rilascio è un buon momento per iniziare. Ricorda solo di impostare i tuoi permessi e lasciare cuocere.&lt;/p&gt;
&lt;p&gt;&lt;a href="https://code.visualstudio.com/updates/v1_112"&gt;Scarica VS Code 1.112&lt;/a&gt; o aggiorna dall&amp;rsquo;interno di VS Code tramite &lt;strong&gt;Aiuto &amp;gt; Controlla aggiornamenti&lt;/strong&gt;.&lt;/p&gt;</content:encoded></item></channel></rss>