{"id":32665,"date":"2021-04-13T19:00:00","date_gmt":"2021-04-13T17:00:00","guid":{"rendered":"https:\/\/blexin.com\/?p=32665"},"modified":"2021-05-28T09:46:59","modified_gmt":"2021-05-28T07:46:59","slug":"migrare-un-progetto-blazor-wasm-hosted-da-net-core-3-1-a-net-5","status":"publish","type":"post","link":"https:\/\/blexin.com\/it\/blog\/migrare-un-progetto-blazor-wasm-hosted-da-net-core-3-1-a-net-5\/","title":{"rendered":"Migrare un progetto Blazor Wasm Hosted da .NET Core 3.1 a .NET 5"},"content":{"rendered":"\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"1024\" height=\"608\" data-attachment-id=\"32666\" data-permalink=\"https:\/\/blexin.com\/it\/blog\/migrare-un-progetto-blazor-wasm-hosted-da-net-core-3-1-a-net-5\/attachment\/8_21_1105x656_blog-blazorwasm\/\" data-orig-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2021\/04\/8_21_1105x656_blog-blazorwasm.png?fit=1105%2C656&amp;ssl=1\" data-orig-size=\"1105,656\" data-comments-opened=\"0\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"8_21_1105x656_blog blazorwasm\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2021\/04\/8_21_1105x656_blog-blazorwasm.png?fit=1024%2C608&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2021\/04\/8_21_1105x656_blog-blazorwasm.png?resize=1024%2C608&#038;ssl=1\" alt=\"Blazor su .NET5\" class=\"wp-image-32666\" srcset=\"https:\/\/blexin.com\/wp-content\/uploads\/2021\/04\/8_21_1105x656_blog-blazorwasm-1024x608.png 1024w, https:\/\/blexin.com\/wp-content\/uploads\/2021\/04\/8_21_1105x656_blog-blazorwasm-980x582.png 980w, https:\/\/blexin.com\/wp-content\/uploads\/2021\/04\/8_21_1105x656_blog-blazorwasm-480x285.png 480w\" sizes=\"auto, (min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1024px, 100vw\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Uno degli obbiettivi della milestone in corso per un nostro cliente \u00e8 la migrazione dalla versione .NET Core 3.1 alla versione .NET 5. Ripercorriamo insieme i passi che abbiamo intrapreso ed analizziamo i correttivi adottati per mitigare alcune breaking changes.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Il progetto in questione \u00e8 un applicativo Blazor Wasm con un backend realizzato in .NET. Il Data Access Layer \u00e8 realizzato con Entity Framework Core.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">1. Partiamo dalle dipendenze<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Al giorno d\u2019oggi non esistono progetti che non abbiano qualche dipendenza da una o pi\u00f9 librerie esterne. Per cominciare, ci accertiamo quindi che tutte le dipendenze del nostro progetto siano compatibili con la nuova versione del framework. A tal proposito, ricordo che .NET 5 supporta tutte le librerie che supportano .NET Standard fino alla versione 2.1. Nel nostro caso, avevamo poche ma fondamentali dipendenze tutte sviluppate con .NET Standard 2.0 e partivamo quindi avvantaggiati.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Il primo consiglio che vi condivido \u00e8 di prediligere, tra le librerie esterne, quelle che implementano .NET Standard con una buona reputazione e supporto.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">2. Aggiorniamo Blazor<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Una volta verificato che tutte le nostre dipendenze saranno utilizzabili anche dopo l\u2019upgrade del framework possiamo iniziare l\u2019aggiornamento dei vari progetti. Partiamo dal progetto di backend e apportiamo le seguenti modifiche:&nbsp;<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Aggiornare il file global.json con la nuova versione dell\u2019SDK<\/li><\/ul>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\n{ \n  &quot;sdk&quot;: { \n\t&quot;version&quot;: &quot;5.0.102&quot; \n   } \n} \n<\/pre><\/div>\n\n\n<ul class=\"wp-block-list\"><li>Aggiornare il TargetFramework del file di progetto&nbsp;<\/li><\/ul>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\n&lt;PropertyGroup&gt; \n&lt;TargetFramework&gt;net5.0&lt;\/TargetFramework&gt; \n&lt;\/PropertyGroup&gt; \n<\/pre><\/div>\n\n\n<ul class=\"wp-block-list\"><li>Aggiornare pacchetti Blazor Server<\/li><\/ul>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\n&lt;PackageReference Include=&quot;Microsoft.AspNetCore.Components.WebAssembly.Server&quot; Version=&quot;5.0.2&quot; \/&gt; \n<\/pre><\/div>\n\n\n<ul class=\"wp-block-list\"><li>Aggiornare tutte le altre dipendenze alla versione che supporti il Framework .NET 5 ad esclusione di EF Core.<\/li><\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">La procedura non \u00e8 particolarmente complessa e non presenta nessuna criticit\u00e0.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Passiamo adesso al progetto di frontend (Blazor Web Assembly) dove qualche piccolo cambiamento in pi\u00f9 \u00e8 necessario ma niente di difficile.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">I passi necessari per aggiornare il front end Blazor sono:<\/p>\n\n\n\n<ul class=\"wp-block-list\"><li>Aggiornare il TargetFramework del file di progetto<\/li><\/ul>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\n&lt;PropertyGroup&gt; \n        &lt;TargetFramework&gt;net5.0&lt;\/TargetFramework&gt; \n&lt;\/PropertyGroup&gt;\n<\/pre><\/div>\n\n\n<ul class=\"wp-block-list\"><li>Aggiornare pacchetti Blazor Client&nbsp;<\/li><\/ul>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\n&lt;PackageReference Include=&quot;Microsoft.AspNetCore.Components.WebAssembly&quot; Version=&quot;5.0.2&quot; \/&gt; \n&lt;PackageReference Include=&quot;Microsoft.AspNetCore.Components.WebAssembly.DevServer&quot; Version=&quot;5.0.2&quot; PrivateAssets=&quot;all&quot; \/&gt; \n&lt;PackageReference Include=&quot;Microsoft.Extensions.Http&quot; Version=&quot;5.0.0&quot; \/&gt;&lt;PackageReference Include=&quot;System.Net.Http.Json&quot; Version=&quot;5.0.0&quot; \/&gt; \n<\/pre><\/div>\n\n\n<ul class=\"wp-block-list\"><li>Modificare il file Index.html<\/li><\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Rimuovere<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\n&lt;app&gt;Loading...&lt;\/app&gt; \n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Aggiungere<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\n&lt;div id=&quot;app&quot;&gt;Loading...&lt;\/div&gt; \n<\/pre><\/div>\n\n\n<ul class=\"wp-block-list\"><li>Modificare il file App.razor<\/li><\/ul>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\n&lt;Router AppAssembly=&quot;@typeof(Program).Assembly&quot; PreferExactMatches=&quot;@true&quot;&gt; \n<\/pre><\/div>\n\n\n<ul class=\"wp-block-list\"><li>Modificare il file Program.cs<\/li><\/ul>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nvar builder = WebAssemblyHostBuilder.CreateDefault(args); \nbuilder.RootComponents.Add&amp;lt;App&gt;(&quot;#app&quot;); \n<\/pre><\/div>\n\n\n<ul class=\"wp-block-list\"><li>Aggiornare tutte le altre dipendenze alla versione che supporti il Framework .NET 5<\/li><\/ul>\n\n\n\n<p class=\"wp-block-paragraph\">Terminata la procedura indicata la nostra applicazione \u00e8 aggiornata alla nuova versione del framework e possiamo iniziare a utilizzare tutte le nuove funzionalit\u00e0 che il framework ci mette a disposizione. Per maggiori informazioni su casi particolari potete dare uno sguardo alla <a href=\"https:\/\/docs.microsoft.com\/it-it\/aspnet\/core\/migration\/31-to-50?view=aspnetcore-5.0&amp;tabs=visual-studio\" target=\"_blank\" rel=\"noreferrer noopener\">guida ufficiale<\/a>.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">3. Aggiorniamo Entity Framework<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Per completare la migrazione del nostro progetto ci troviamo adesso davanti ad una scelta, continuare ad utilizzare Entity Framework nella versione 3.1 oppure completare il percorso di migrazione con l\u2019upgrade alla versione 5.0 di EF Core?&nbsp;&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Potrebbe sembrare una scelta banale: visto che stiamo aggiornando all\u2019ultima versione del framework perch\u00e9 non aggiornare anche la \u201cDipendenza\u201d all\u2019ultima versione?&nbsp;&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Premesso che Entity Framework Core \u00e8 una libreria .NET Standard 2.0 gi\u00e0 dalla versione 3.1, entrambe le versioni sono quindi supportate in .NET 5. Purtroppo per\u00f2 Entity Framework Core 5.0 presenta una serie di modifiche al provider LINQ per SQL Server (che utilizziamo nel nostro progetto ) e che potrebbero avere un impatto non prevedibile sulla nostra applicazione sia in termini funzionali che in termini prestazionali.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Fortunatamente il nostro progetto \u00e8 fornito di una buona suite di test e test di carico cos\u00ec decidiamo di provare l\u2019upgrade anche di Entity Framework Core alla versione 5.0.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Tecnicamente essendo una libreria esterna quello che abbiamo fatto \u00e8 stato aggiornare la versione dei pacchetti nel file di progetto.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\n&lt;PackageReference Include=&quot;Microsoft.EntityFrameworkCore&quot; Version=&quot;5.0.2&quot; \/&gt; \n&lt;PackageReference Include=&quot;Microsoft.EntityFrameworkCore.SqlServer&quot; Version=&quot;5.0.2&quot; \/&gt; \n&lt;PackageReference Include=&quot;Microsoft.EntityFrameworkCore.Tools&quot; Version=&quot;5.0.2&quot;&gt; \n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Abbiamo lanciato i test e come era prevedibile molti test non sono stati superati. Non ci siamo persi d\u2019animo e siamo andati ad analizzare i vari test falliti ed abbiamo individuato alcune criticit\u00e0 dovute ai <a href=\"https:\/\/docs.microsoft.com\/it-it\/ef\/core\/what-is-new\/ef-core-5.0\/breaking-changes\" target=\"_blank\" rel=\"noreferrer noopener\">breaking changes<\/a> introdotti nella nuova versione a cui eravamo preparati, ed alcuni non documentati che abbiamo scoperto ed affrontato strada facendo da buoni sviluppatori.&nbsp;Una delle novit\u00e0 introdotte in Entity Framework Core 5 \u00e8 lo <strong>Split Queries<\/strong>.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Il provider LINQ to SQL converte le query LINQ in codice T-SQL da eseguire sul DBMS e mappa il risultato di queste query sulle entit\u00e0 definite nel context.&nbsp;&nbsp;Utilizzando l\u2019opzione Split Queries, il provider LINQ generer\u00e0 N queries piccole per ogni Tabella coinvolta utilizzando le <em>Join <\/em>come filtro sulle tabelle collegate, in questo modo sia la fase di recupero dati dal DBMS che la successiva fase di mapping delle entit\u00e0 di dominio posso essere parallelizzate ed ottimizzate, Un piccolo esempio preso dalla documentazione per capire meglio il meccanismo.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\nvar artists = context.Artists         \n        .Include(e =&gt; e.Albums)  \n        .ToList(); \n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Generer\u00e0 il codice T- SQL<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\nSELECT a.&quot;Id&quot;, a.&quot;Name&quot;, a0.&quot;Id&quot;, a0.&quot;ArtistId&quot;, a0.&quot;Title&quot; \nFROM &quot;Artists&quot; AS a \nLEFT JOIN &quot;Album&quot; AS a0 ON a.&quot;Id&quot; = a0.&quot;ArtistId&quot; \nORDER BY a.&quot;Id&quot;, a0.&quot;Id&quot; \n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Mentre<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\nvar artists = context.Artists \n     .Include(e =&gt; e.Albums) \n     .AsSplitQuery() \n     .ToList(); \n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Generer\u00e0 il codice T-SQL<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nSELECT a.&quot;Id&quot;, a.&quot;Name&quot; \nFROM &quot;Artists&quot; AS a \nORDER BY a.&quot;Id&quot; \n  \nSELECT a0.&quot;Id&quot;, a0.&quot;ArtistId&quot;, a0.&quot;Title&quot;, a.&quot;Id&quot; \nFROM &quot;Artists&quot; AS a \nINNER JOIN &quot;Album&quot; AS a0 ON a.&quot;Id&quot; = a0.&quot;ArtistId&quot; \nORDER BY a.&quot;Id&quot; \n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Di default lo <em>split queries<\/em> \u00e8 disabilitato ed \u00e8 possibile utilizzarlo singolarmente su ogni query con il metodo AsSplitQuery() oppure globalmente nell\u2019 OnConfiguring (<a href=\"https:\/\/docs.microsoft.com\/it-it\/ef\/core\/querying\/single-split-queries\" target=\"_blank\" rel=\"noreferrer noopener\">documentazione<\/a>).&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">\u00c8 inoltre possibile abilitare un warning che a runtime segnali le query che potenzialmente potrebbero beneficiare di un incremento di performance con l\u2019abilitazione dello Split Queries.<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: plain; title: ; notranslate\" title=\"\">\nservices.AddDbContext&amp;lt;ItinerisDbContext&gt;(opt =&gt; \n        { \n                opt.UseSqlServer(Configuration.GetConnectionString(&quot;SqlServerConnectionString&quot;)); \n                opt.ConfigureWarnings(s =&gt; s.Log(RelationalEventId.MultipleCollectionIncludeWarning)); \n        }); \n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Un&#8217;altra novit\u00e0 introdotta in EF Core \u00e8 la possibilit\u00e0 di filtrare gli Include es:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\nvar blogs = context.Blogs \n    .Include(e =&gt; e.Posts.Where(p =&gt; p.Title.Contains(&quot;Cheese&quot;))) \n\t.ToList(); \n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Le due novit\u00e0 appena viste introducono un breaking change non documentato, che i nostri test hanno portato alla luce.&nbsp;&nbsp;Le query che producono proiezioni su diverse collezioni con l\u2019istruzione <em>Select <\/em>devono contenere anche tutti gli <em>Include <\/em>necessari alla proiezione, altrimenti le propriet\u00e0 delle collezioni collegate saranno sempre \u201cnull\u201d.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Poco male, introdotti gli Include necessari i test falliti sono finalmente passati.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Una volta risolti i problemi evidenziati dagli unit test lanciamo i test di carico ed i risultati non sono stati proprio all\u2019altezza delle aspettative, in alcuni casi abbiamo riscontrato un degrado delle performance rispetto alla versione 3.1 anche del 50%.<\/p>\n\n\n\n<figure class=\"wp-block-image size-large\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" width=\"562\" height=\"485\" data-attachment-id=\"32687\" data-permalink=\"https:\/\/blexin.com\/it\/blog\/migrare-un-progetto-blazor-wasm-hosted-da-net-core-3-1-a-net-5\/attachment\/1-5\/\" data-orig-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2021\/04\/1.png?fit=562%2C485&amp;ssl=1\" data-orig-size=\"562,485\" data-comments-opened=\"0\" data-image-meta=\"{&quot;aperture&quot;:&quot;0&quot;,&quot;credit&quot;:&quot;&quot;,&quot;camera&quot;:&quot;&quot;,&quot;caption&quot;:&quot;&quot;,&quot;created_timestamp&quot;:&quot;0&quot;,&quot;copyright&quot;:&quot;&quot;,&quot;focal_length&quot;:&quot;0&quot;,&quot;iso&quot;:&quot;0&quot;,&quot;shutter_speed&quot;:&quot;0&quot;,&quot;title&quot;:&quot;&quot;,&quot;orientation&quot;:&quot;0&quot;}\" data-image-title=\"1\" data-image-description=\"\" data-image-caption=\"\" data-large-file=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2021\/04\/1.png?fit=562%2C485&amp;ssl=1\" src=\"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2021\/04\/1.png?resize=562%2C485&#038;ssl=1\" alt=\"\" class=\"wp-image-32687\" srcset=\"https:\/\/blexin.com\/wp-content\/uploads\/2021\/04\/1.png 562w, https:\/\/blexin.com\/wp-content\/uploads\/2021\/04\/1-480x414.png 480w\" sizes=\"auto, (min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) 562px, 100vw\" \/><\/figure>\n\n\n\n<p class=\"wp-block-paragraph\">Per effettuare il tuning delle query utilizziamo un&#8217;altra novit\u00e0 di Entity Framework Core 5: il log nelle query eseguite. Tramite questo meccanismo possiamo analizzarle e ottimizzarle.&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Il log si abilitata nel seguente modo:<\/p>\n\n\n<div class=\"wp-block-syntaxhighlighter-code \"><pre class=\"brush: csharp; title: ; notranslate\" title=\"\">\nservices.AddDbContext&lt;ItinerisDbContext&gt;(opt =&gt; \n{ \n      \u2026 \n      opt.LogTo(l =&gt; Console.WriteLine(l)); \n}); \n<\/pre><\/div>\n\n\n<p class=\"wp-block-paragraph\">Analizzando i warning ed i log forniti ci siamo lanciati in una sessione di tuning del codice. Un uso oculato dello split query e l\u2019utilizzo di metodi specifici che il provider SQL Server mette a disposizione (ad esempio Like()) ci permette in parte di mitigare il calo di performance senza per\u00f2 raggiungere i livelli della versione precedente.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\">Conclusioni<\/h2>\n\n\n\n<p class=\"wp-block-paragraph\">Concludendo, se da una parte l\u2019upgrade alla nuova versione nel framework ha generato reali benefici sia in termini di performance che nuove funzionalit\u00e0, l\u2019upgrade di EF Core non \u00e8 stato n\u00e9 indolore e&nbsp; veloce n\u00e9 tanto meno esente da imprecazioni .&nbsp;<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">L\u2019upgrade di EF Core lo consiglio in quei progetti dove si ha una buona copertura di test unitari per individuare automaticamente tutti i punti da modificare. Se il progetto non \u00e8 corredato di test armatevi di tanta pazienza e ponete particolare attenzione ai metodi che recuperate dal DB.<\/p>\n\n\n\n<p class=\"wp-block-paragraph\">Buona Strada<\/p>\n\n\n\n\n","protected":false},"excerpt":{"rendered":"<p>Alcuni trucchi per non impazzire durante la migrazione <\/p>\n","protected":false},"author":196716252,"featured_media":32666,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"_et_pb_use_builder":"off","_et_pb_old_content":"","_et_gb_content_width":"","_coblocks_attr":"","_coblocks_dimensions":"","_coblocks_responsive_height":"","_coblocks_accordion_ie_support":"","_crdt_document":"","inline_featured_image":false,"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":true,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"_wpas_customize_per_network":false,"jetpack_post_was_ever_published":false},"categories":[688637374],"tags":[688637420,688637541,688637414,688637459,688637382],"class_list":["post-32665","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-blog","tag-net","tag-dotnetcore","tag-asp-net-core","tag-blazor","tag-c"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Migrare un progetto Blazor Wasm Hosted da .NET Core 3.1 a .NET 5 - Blexin<\/title>\n<meta name=\"description\" content=\"Ogni migrazione porta con s\u00e9 problemi di compatibilit\u00e0: vediamo con Antonio come passare un progetto Blazor a .NET 5 senza rischi\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/blexin.com\/it\/blog\/migrare-un-progetto-blazor-wasm-hosted-da-net-core-3-1-a-net-5\/\" \/>\n<meta property=\"og:locale\" content=\"it_IT\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Migrare un progetto Blazor Wasm Hosted da .NET Core 3.1 a .NET 5 - Blexin\" \/>\n<meta property=\"og:description\" content=\"Ogni migrazione porta con s\u00e9 problemi di compatibilit\u00e0: vediamo con Antonio come passare un progetto Blazor a .NET 5 senza rischi\" \/>\n<meta property=\"og:url\" content=\"https:\/\/blexin.com\/it\/blog\/migrare-un-progetto-blazor-wasm-hosted-da-net-core-3-1-a-net-5\/\" \/>\n<meta property=\"og:site_name\" content=\"Blexin\" \/>\n<meta property=\"article:published_time\" content=\"2021-04-13T17:00:00+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2021-05-28T07:46:59+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/i2.wp.com\/blexin.com\/wp-content\/uploads\/2021\/04\/8_21_1105x656_blog-blazorwasm.png?fit=1105%2C656&ssl=1\" \/>\n\t<meta property=\"og:image:width\" content=\"1105\" \/>\n\t<meta property=\"og:image:height\" content=\"656\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Antonio Venditti\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Scritto da\" \/>\n\t<meta name=\"twitter:data1\" content=\"Antonio Venditti\" \/>\n\t<meta name=\"twitter:label2\" content=\"Tempo di lettura stimato\" \/>\n\t<meta name=\"twitter:data2\" content=\"6 minuti\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/migrare-un-progetto-blazor-wasm-hosted-da-net-core-3-1-a-net-5\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/migrare-un-progetto-blazor-wasm-hosted-da-net-core-3-1-a-net-5\\\/\"},\"author\":{\"name\":\"Antonio Venditti\",\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/#\\\/schema\\\/person\\\/22c32a7a08e0ea5a2ff91b284e311b8e\"},\"headline\":\"Migrare un progetto Blazor Wasm Hosted da .NET Core 3.1 a .NET 5\",\"datePublished\":\"2021-04-13T17:00:00+00:00\",\"dateModified\":\"2021-05-28T07:46:59+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/migrare-un-progetto-blazor-wasm-hosted-da-net-core-3-1-a-net-5\\\/\"},\"wordCount\":1070,\"image\":{\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/migrare-un-progetto-blazor-wasm-hosted-da-net-core-3-1-a-net-5\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/i0.wp.com\\\/blexin.com\\\/wp-content\\\/uploads\\\/2021\\\/04\\\/8_21_1105x656_blog-blazorwasm.png?fit=1105%2C656&ssl=1\",\"keywords\":[\".Net\",\".NetCore\",\"Asp.net core\",\"Blazor\",\"C#\"],\"articleSection\":[\"Blog\"],\"inLanguage\":\"it-IT\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/migrare-un-progetto-blazor-wasm-hosted-da-net-core-3-1-a-net-5\\\/\",\"url\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/migrare-un-progetto-blazor-wasm-hosted-da-net-core-3-1-a-net-5\\\/\",\"name\":\"Migrare un progetto Blazor Wasm Hosted da .NET Core 3.1 a .NET 5 - Blexin\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/migrare-un-progetto-blazor-wasm-hosted-da-net-core-3-1-a-net-5\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/migrare-un-progetto-blazor-wasm-hosted-da-net-core-3-1-a-net-5\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/i0.wp.com\\\/blexin.com\\\/wp-content\\\/uploads\\\/2021\\\/04\\\/8_21_1105x656_blog-blazorwasm.png?fit=1105%2C656&ssl=1\",\"datePublished\":\"2021-04-13T17:00:00+00:00\",\"dateModified\":\"2021-05-28T07:46:59+00:00\",\"author\":{\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/#\\\/schema\\\/person\\\/22c32a7a08e0ea5a2ff91b284e311b8e\"},\"description\":\"Ogni migrazione porta con s\u00e9 problemi di compatibilit\u00e0: vediamo con Antonio come passare un progetto Blazor a .NET 5 senza rischi\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/migrare-un-progetto-blazor-wasm-hosted-da-net-core-3-1-a-net-5\\\/#breadcrumb\"},\"inLanguage\":\"it-IT\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/migrare-un-progetto-blazor-wasm-hosted-da-net-core-3-1-a-net-5\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"it-IT\",\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/migrare-un-progetto-blazor-wasm-hosted-da-net-core-3-1-a-net-5\\\/#primaryimage\",\"url\":\"https:\\\/\\\/i0.wp.com\\\/blexin.com\\\/wp-content\\\/uploads\\\/2021\\\/04\\\/8_21_1105x656_blog-blazorwasm.png?fit=1105%2C656&ssl=1\",\"contentUrl\":\"https:\\\/\\\/i0.wp.com\\\/blexin.com\\\/wp-content\\\/uploads\\\/2021\\\/04\\\/8_21_1105x656_blog-blazorwasm.png?fit=1105%2C656&ssl=1\",\"width\":1105,\"height\":656,\"caption\":\"Blazor su .NET5\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/blog\\\/migrare-un-progetto-blazor-wasm-hosted-da-net-core-3-1-a-net-5\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/blexin.com\\\/it\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Migrare un progetto Blazor Wasm Hosted da .NET Core 3.1 a .NET 5\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/#website\",\"url\":\"https:\\\/\\\/blexin.com\\\/it\\\/\",\"name\":\"Blexin\",\"description\":\"Con noi \u00e8 semplice\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/blexin.com\\\/it\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"it-IT\"},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/blexin.com\\\/it\\\/#\\\/schema\\\/person\\\/22c32a7a08e0ea5a2ff91b284e311b8e\",\"name\":\"Antonio Venditti\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"it-IT\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/3460007fe9323a859b603fbf3fe3b196d028ff22e53c85567b5a2b5cc2b022f5?s=96&d=identicon&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/3460007fe9323a859b603fbf3fe3b196d028ff22e53c85567b5a2b5cc2b022f5?s=96&d=identicon&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/3460007fe9323a859b603fbf3fe3b196d028ff22e53c85567b5a2b5cc2b022f5?s=96&d=identicon&r=g\",\"caption\":\"Antonio Venditti\"},\"url\":\"https:\\\/\\\/blexin.com\\\/it\\\/author\\\/antonio-vendittiblexin-com\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Migrare un progetto Blazor Wasm Hosted da .NET Core 3.1 a .NET 5 - Blexin","description":"Ogni migrazione porta con s\u00e9 problemi di compatibilit\u00e0: vediamo con Antonio come passare un progetto Blazor a .NET 5 senza rischi","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/blexin.com\/it\/blog\/migrare-un-progetto-blazor-wasm-hosted-da-net-core-3-1-a-net-5\/","og_locale":"it_IT","og_type":"article","og_title":"Migrare un progetto Blazor Wasm Hosted da .NET Core 3.1 a .NET 5 - Blexin","og_description":"Ogni migrazione porta con s\u00e9 problemi di compatibilit\u00e0: vediamo con Antonio come passare un progetto Blazor a .NET 5 senza rischi","og_url":"https:\/\/blexin.com\/it\/blog\/migrare-un-progetto-blazor-wasm-hosted-da-net-core-3-1-a-net-5\/","og_site_name":"Blexin","article_published_time":"2021-04-13T17:00:00+00:00","article_modified_time":"2021-05-28T07:46:59+00:00","og_image":[{"width":1105,"height":656,"url":"https:\/\/i2.wp.com\/blexin.com\/wp-content\/uploads\/2021\/04\/8_21_1105x656_blog-blazorwasm.png?fit=1105%2C656&ssl=1","type":"image\/png"}],"author":"Antonio Venditti","twitter_card":"summary_large_image","twitter_misc":{"Scritto da":"Antonio Venditti","Tempo di lettura stimato":"6 minuti"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/blexin.com\/it\/blog\/migrare-un-progetto-blazor-wasm-hosted-da-net-core-3-1-a-net-5\/#article","isPartOf":{"@id":"https:\/\/blexin.com\/it\/blog\/migrare-un-progetto-blazor-wasm-hosted-da-net-core-3-1-a-net-5\/"},"author":{"name":"Antonio Venditti","@id":"https:\/\/blexin.com\/it\/#\/schema\/person\/22c32a7a08e0ea5a2ff91b284e311b8e"},"headline":"Migrare un progetto Blazor Wasm Hosted da .NET Core 3.1 a .NET 5","datePublished":"2021-04-13T17:00:00+00:00","dateModified":"2021-05-28T07:46:59+00:00","mainEntityOfPage":{"@id":"https:\/\/blexin.com\/it\/blog\/migrare-un-progetto-blazor-wasm-hosted-da-net-core-3-1-a-net-5\/"},"wordCount":1070,"image":{"@id":"https:\/\/blexin.com\/it\/blog\/migrare-un-progetto-blazor-wasm-hosted-da-net-core-3-1-a-net-5\/#primaryimage"},"thumbnailUrl":"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2021\/04\/8_21_1105x656_blog-blazorwasm.png?fit=1105%2C656&ssl=1","keywords":[".Net",".NetCore","Asp.net core","Blazor","C#"],"articleSection":["Blog"],"inLanguage":"it-IT"},{"@type":"WebPage","@id":"https:\/\/blexin.com\/it\/blog\/migrare-un-progetto-blazor-wasm-hosted-da-net-core-3-1-a-net-5\/","url":"https:\/\/blexin.com\/it\/blog\/migrare-un-progetto-blazor-wasm-hosted-da-net-core-3-1-a-net-5\/","name":"Migrare un progetto Blazor Wasm Hosted da .NET Core 3.1 a .NET 5 - Blexin","isPartOf":{"@id":"https:\/\/blexin.com\/it\/#website"},"primaryImageOfPage":{"@id":"https:\/\/blexin.com\/it\/blog\/migrare-un-progetto-blazor-wasm-hosted-da-net-core-3-1-a-net-5\/#primaryimage"},"image":{"@id":"https:\/\/blexin.com\/it\/blog\/migrare-un-progetto-blazor-wasm-hosted-da-net-core-3-1-a-net-5\/#primaryimage"},"thumbnailUrl":"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2021\/04\/8_21_1105x656_blog-blazorwasm.png?fit=1105%2C656&ssl=1","datePublished":"2021-04-13T17:00:00+00:00","dateModified":"2021-05-28T07:46:59+00:00","author":{"@id":"https:\/\/blexin.com\/it\/#\/schema\/person\/22c32a7a08e0ea5a2ff91b284e311b8e"},"description":"Ogni migrazione porta con s\u00e9 problemi di compatibilit\u00e0: vediamo con Antonio come passare un progetto Blazor a .NET 5 senza rischi","breadcrumb":{"@id":"https:\/\/blexin.com\/it\/blog\/migrare-un-progetto-blazor-wasm-hosted-da-net-core-3-1-a-net-5\/#breadcrumb"},"inLanguage":"it-IT","potentialAction":[{"@type":"ReadAction","target":["https:\/\/blexin.com\/it\/blog\/migrare-un-progetto-blazor-wasm-hosted-da-net-core-3-1-a-net-5\/"]}]},{"@type":"ImageObject","inLanguage":"it-IT","@id":"https:\/\/blexin.com\/it\/blog\/migrare-un-progetto-blazor-wasm-hosted-da-net-core-3-1-a-net-5\/#primaryimage","url":"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2021\/04\/8_21_1105x656_blog-blazorwasm.png?fit=1105%2C656&ssl=1","contentUrl":"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2021\/04\/8_21_1105x656_blog-blazorwasm.png?fit=1105%2C656&ssl=1","width":1105,"height":656,"caption":"Blazor su .NET5"},{"@type":"BreadcrumbList","@id":"https:\/\/blexin.com\/it\/blog\/migrare-un-progetto-blazor-wasm-hosted-da-net-core-3-1-a-net-5\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/blexin.com\/it\/"},{"@type":"ListItem","position":2,"name":"Migrare un progetto Blazor Wasm Hosted da .NET Core 3.1 a .NET 5"}]},{"@type":"WebSite","@id":"https:\/\/blexin.com\/it\/#website","url":"https:\/\/blexin.com\/it\/","name":"Blexin","description":"Con noi \u00e8 semplice","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/blexin.com\/it\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"it-IT"},{"@type":"Person","@id":"https:\/\/blexin.com\/it\/#\/schema\/person\/22c32a7a08e0ea5a2ff91b284e311b8e","name":"Antonio Venditti","image":{"@type":"ImageObject","inLanguage":"it-IT","@id":"https:\/\/secure.gravatar.com\/avatar\/3460007fe9323a859b603fbf3fe3b196d028ff22e53c85567b5a2b5cc2b022f5?s=96&d=identicon&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/3460007fe9323a859b603fbf3fe3b196d028ff22e53c85567b5a2b5cc2b022f5?s=96&d=identicon&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/3460007fe9323a859b603fbf3fe3b196d028ff22e53c85567b5a2b5cc2b022f5?s=96&d=identicon&r=g","caption":"Antonio Venditti"},"url":"https:\/\/blexin.com\/it\/author\/antonio-vendittiblexin-com\/"}]}},"jetpack_publicize_connections":[],"jetpack_featured_media_url":"https:\/\/i0.wp.com\/blexin.com\/wp-content\/uploads\/2021\/04\/8_21_1105x656_blog-blazorwasm.png?fit=1105%2C656&ssl=1","jetpack_shortlink":"https:\/\/wp.me\/pcyUBx-8uR","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/posts\/32665","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/users\/196716252"}],"replies":[{"embeddable":true,"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/comments?post=32665"}],"version-history":[{"count":24,"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/posts\/32665\/revisions"}],"predecessor-version":[{"id":33025,"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/posts\/32665\/revisions\/33025"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/media\/32666"}],"wp:attachment":[{"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/media?parent=32665"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/categories?post=32665"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blexin.com\/it\/wp-json\/wp\/v2\/tags?post=32665"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}