Il blog di Pietro Libro http://blogs.ugidotnet.org/PietroLibroBlog/Default.aspx it-IT Pietro Libro pietro.libro@libero.it Subtext Version 2.6.0.0 Il blog di Pietro Libro http://blogs.ugidotnet.org/images/RSS2Image.gif http://blogs.ugidotnet.org/PietroLibroBlog/Default.aspx 77 60 Screen Resolution Debian (guest) su Hyper-V Virtual Machine Varie ed eventuali http://blogs.ugidotnet.org/PietroLibroBlog/archive/2017/03/12/screen-resolution-debian-guest-su-hyper-v.aspx <p>Se si ha una macchina virtuale Debian come guest su Hyper-V e si ha la necessità di cambiare la risoluzione dello schermo, dopo averle provate tutte, provare anche questa <img class="wlEmoticon wlEmoticon-smile" style="border-top-style: none; border-left-style: none; border-bottom-style: none; border-right-style: none" alt="Smile" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/1e3e389fa7c1_98F9/wlEmoticon-smile_2.png" />. </p> <p>Come riportato su<a title="http://uglygizmo.blogspot.ch/2014/06/debian-screen-resolution-when-hyper-v.html" href="http://uglygizmo.blogspot.ch/2014/06/debian-screen-resolution-when-hyper-v.html" target="_blank"> uglygizmo.blogspot.ch</a> i passi da seguire sono veramente pochi, per convenienza li riporto qui:</p> <ol> <li>Edit the grub configuration file, for example:  <font face="Courier New">sudo vi /etc/default/grub</font></li> <li>Find the line starting with GRUB_CMDLINE_LINUX_DEFAULT, and add "video=hyperv_fb:1680x1050" (or your custom resolution) in between the quotes. For example: <font face="Courier New">GRUB_CMDLINE_LINUX_DEFAULT="quiet splash video=hyperv_fb:1680x1050"</font></li> <li>Save and exit  </li> <li>Run <font face="Courier New">sudo update-grub</font></li> <li>Restart your computer </li> </ol> <p>Nel mio caso finalmente sono riuscito ad impostare la risoluzione desiderata.</p><img src="http://blogs.ugidotnet.org/PietroLibroBlog/aggbug/102380.aspx" width="1" height="1" /> Pietro Libro http://blogs.ugidotnet.org/PietroLibroBlog/archive/2017/03/12/screen-resolution-debian-guest-su-hyper-v.aspx Sun, 12 Mar 2017 12:02:00 GMT http://blogs.ugidotnet.org/PietroLibroBlog/archive/2017/03/12/screen-resolution-debian-guest-su-hyper-v.aspx#feedback http://blogs.ugidotnet.org/PietroLibroBlog/comments/commentRss/102380.aspx http://blogs.ugidotnet.org/PietroLibroBlog/services/trackbacks/102380.aspx Add REST Api Client: Unable to resolve dependency&hellip; .NET Core Visual Studio 2015 http://blogs.ugidotnet.org/PietroLibroBlog/archive/2017/03/09/add-rest-api-client-unable-to-resolve-dependencyhellip.aspx <p>Se avete intenzione di utilizzare lo strumento “Add REST Api Client” di Visual Studio (2015/2017 poco importa):</p> <p><a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/Add-REST-Api-Client-e-Unable_DD5C/image_2.png"><img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; margin: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/Add-REST-Api-Client-e-Unable_DD5C/image_thumb.png" width="244" height="212" /></a></p> <p>e vi “scontrate” con l’errore “Unable to resolve dependency ‘Microsoft.NETCore.Platform ….’</p> <p><a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/Add-REST-Api-Client-e-Unable_DD5C/image_4.png"><img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; margin: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/Add-REST-Api-Client-e-Unable_DD5C/image_thumb_1.png" width="244" height="81" /></a></p> <p>Un “workaround” veloce è installare il pacchetto “Microsoft.Rest.ClientRuntime”:</p> <p><font face="Courier New">Install-Package Microsoft.Rest.ClientRuntime</font></p> <p>Attendere il tempo necessario (scarica un po’ di pacchetti di contorno <img class="wlEmoticon wlEmoticon-smile" style="border-top-style: none; border-left-style: none; border-bottom-style: none; border-right-style: none" alt="Smile" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/Add-REST-Api-Client-e-Unable_DD5C/wlEmoticon-smile_2.png" />) e poi riprovare l’aggiunta del client REST, questa volta con successo:</p> <p><a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/Add-REST-Api-Client-e-Unable_DD5C/image_6.png"><img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; margin: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/Add-REST-Api-Client-e-Unable_DD5C/image_thumb_2.png" width="244" height="144" /></a></p><img src="http://blogs.ugidotnet.org/PietroLibroBlog/aggbug/102374.aspx" width="1" height="1" /> Pietro Libro http://blogs.ugidotnet.org/PietroLibroBlog/archive/2017/03/09/add-rest-api-client-unable-to-resolve-dependencyhellip.aspx Thu, 09 Mar 2017 16:53:00 GMT http://blogs.ugidotnet.org/PietroLibroBlog/archive/2017/03/09/add-rest-api-client-unable-to-resolve-dependencyhellip.aspx#feedback http://blogs.ugidotnet.org/PietroLibroBlog/comments/commentRss/102374.aspx http://blogs.ugidotnet.org/PietroLibroBlog/services/trackbacks/102374.aspx .NET Core &amp; Linux .NET Core C# Virtual Machine http://blogs.ugidotnet.org/PietroLibroBlog/archive/2016/10/30/.net-core-amp-linux.aspx <p>E’ praticamente una vita che non scrivo piu’ su questo blog per diversi motivi (non penso se ne siano accorti in molti <img class="wlEmoticon wlEmoticon-openmouthedsmile" style="border-top-style: none; border-left-style: none; border-bottom-style: none; border-right-style: none" alt="Open-mouthed smile" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/a3fbaeda6247.NET-Core--Linux_72D3/wlEmoticon-openmouthedsmile_2.png" />), ma alla fine (meglio tardi che mai) eccomi con un nuovo post, con un nuovo progetto in testa: portare avanti una guida sullo sviluppo di .NET Core &amp; affini in ambiente Linux. Una prima versione del documento è scaricabile qui: <a href="http://www.pietrolibro.it/documents/NET%20Core%201.0%20e%20Linux.pdf" target="_blank">.NET Core &amp; ASP.NET Core in ambiente Linux</a> : si parte dall’installazione di .NET Core in OpenSuse 13.2 fino alla pubblicazione di una semplice Web API su Azure tramite Git, ovviamente usando VS Code come IDE e “molta riga di comando”. Gli argomenti da sviluppare (EF Core, IoT, OpenID etc …) sono ovviamente ancora tanti (compresi gli aggiornamenti rilasciati in questi giorni), vedremo se alla fine del progetto ne uscirà un buon documento. Al prossimo aggiornamento <img class="wlEmoticon wlEmoticon-smile" style="border-top-style: none; border-left-style: none; border-bottom-style: none; border-right-style: none" alt="Smile" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/a3fbaeda6247.NET-Core--Linux_72D3/wlEmoticon-smile_2.png" /></p><img src="http://blogs.ugidotnet.org/PietroLibroBlog/aggbug/102255.aspx" width="1" height="1" /> Pietro Libro http://blogs.ugidotnet.org/PietroLibroBlog/archive/2016/10/30/.net-core-amp-linux.aspx Sun, 30 Oct 2016 09:24:00 GMT http://blogs.ugidotnet.org/PietroLibroBlog/archive/2016/10/30/.net-core-amp-linux.aspx#feedback 1 http://blogs.ugidotnet.org/PietroLibroBlog/comments/commentRss/102255.aspx http://blogs.ugidotnet.org/PietroLibroBlog/services/trackbacks/102255.aspx Documentazione EF 7 (Beta 5) Visual Basic .Net C# LINQ SQL ASP.NET Tools Entity Framework 7 Visual Studio 2015 http://blogs.ugidotnet.org/PietroLibroBlog/archive/2015/07/22/documentazione-ef-7-beta-5.aspx Documentazione "Work in Progress" della prossima release di Entity Framework : <a href="http://ef.readthedocs.org/en/latest/" target="_blank">http://ef.readthedocs.org/en/latest/</a><img src="http://blogs.ugidotnet.org/PietroLibroBlog/aggbug/102030.aspx" width="1" height="1" /> Pietro Libro http://blogs.ugidotnet.org/PietroLibroBlog/archive/2015/07/22/documentazione-ef-7-beta-5.aspx Wed, 22 Jul 2015 09:07:28 GMT http://blogs.ugidotnet.org/PietroLibroBlog/archive/2015/07/22/documentazione-ef-7-beta-5.aspx#feedback http://blogs.ugidotnet.org/PietroLibroBlog/comments/commentRss/102030.aspx http://blogs.ugidotnet.org/PietroLibroBlog/services/trackbacks/102030.aspx ASP.NET 5 e AzureTableStorage Entity Framework 7 ASP.NET 5 C# http://blogs.ugidotnet.org/PietroLibroBlog/archive/2014/11/30/asp.net-5-e-azuretablestorage.aspx <p>Riprendiamo l’esempio del post <a href="http://blogs.ugidotnet.org/PietroLibroBlog/archive/2014/11/30/asp.net-5-e-entity-framework-7-beta.aspx" target="_blank">precedente</a> per testare l’integrazione tra EF7 e lo storage di Azure. Apriamo NuGet ed installiamo il package “EntityFramework.AzureTableStorage” (sempre in beta):</p> <p><a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/ASP.NET-5-e-AzureTableStorage_12A85/image_2.png"><img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/ASP.NET-5-e-AzureTableStorage_12A85/image_thumb.png" width="244" height="65" /></a></p> <p>Modifichiamo il codice della classe <em>ItemDB</em> in questo modo:</p> <p> </p><div id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:68787369-7880-4ef3-a7a0-14d1d7b508da" class="wlWriterEditableSmartContent" style="float: none; padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px"><pre style=" width: 754px; height: 279px;background-color:White;white-space:-moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; white-space: pre-wrap; word-wrap: break-word;overflow: auto;"><div><!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --><span style="color: #008080;"> 1</span> <span style="color: #000000;"> </span><span style="color: #0000FF;">public</span><span style="color: #000000;"> </span><span style="color: #0000FF;">class</span><span style="color: #000000;"> ItemDB : DbContext </span><span style="color: #008080;"> 2</span> <span style="color: #000000;"> { </span><span style="color: #008080;"> 3</span> <span style="color: #000000;"> </span><span style="color: #0000FF;">public</span><span style="color: #000000;"> DbSet</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">Item</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"> Items { </span><span style="color: #0000FF;">get</span><span style="color: #000000;">; </span><span style="color: #0000FF;">set</span><span style="color: #000000;">; } </span><span style="color: #008080;"> 4</span> <span style="color: #000000;"> </span><span style="color: #008080;"> 5</span> <span style="color: #000000;"> </span><span style="color: #0000FF;">protected</span><span style="color: #000000;"> </span><span style="color: #0000FF;">override</span><span style="color: #000000;"> </span><span style="color: #0000FF;">void</span><span style="color: #000000;"> OnConfiguring(DbContextOptions options) </span><span style="color: #008080;"> 6</span> <span style="color: #000000;"> { </span><span style="color: #008080;"> 7</span> <span style="color: #000000;"> options.UseAzureTableStorage(</span><span style="color: #800000;">"</span><span style="color: #800000;">[Storage_Name]</span><span style="color: #800000;">"</span><span style="color: #000000;">, </span><span style="color: #800000;">"</span><span style="color: #800000;">[Secret_Key</span><span style="color: #800000;">"</span><span style="color: #000000;">); </span><span style="color: #008080;"> 8</span> <span style="color: #000000;"> } </span><span style="color: #008080;"> 9</span> <span style="color: #000000;"> </span><span style="color: #008080;">10</span> <span style="color: #000000;"> </span><span style="color: #0000FF;">protected</span><span style="color: #000000;"> </span><span style="color: #0000FF;">override</span><span style="color: #000000;"> </span><span style="color: #0000FF;">void</span><span style="color: #000000;"> OnModelCreating(ModelBuilder modelBuilder) </span><span style="color: #008080;">11</span> <span style="color: #000000;"> { </span><span style="color: #008080;">12</span> <span style="color: #000000;"> modelBuilder.Entity</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">Item</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">().ForAzureTableStorage() </span><span style="color: #008080;">13</span> <span style="color: #000000;"> .PartitionAndRowKey(a </span><span style="color: #000000;">=&gt;</span><span style="color: #000000;"> a.CategoryId, a </span><span style="color: #000000;">=&gt;</span><span style="color: #000000;"> a.Id) </span><span style="color: #008080;">14</span> <span style="color: #000000;"> .Table(</span><span style="color: #800000;">"</span><span style="color: #800000;">Items</span><span style="color: #800000;">"</span><span style="color: #000000;">); </span><span style="color: #008080;">15</span> <span style="color: #000000;"> } </span><span style="color: #008080;">16</span> <span style="color: #000000;"> }</span></div></pre><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin. http://dunnhq.com --></div> <p>Rispetto all’esempio precedente è stato rimosso il metodo di estensione <em>UseSqlServer</em> ed aggiunto un degli overload di <em>UseAzureTableStorage </em>che accetta in ingresso due parametri: <em>accountName</em> ed <em>accountKey</em>. Tramite l’override di <em>OnModelCreating</em> andiamo ad istruire il runtime sulle propietà della classe <em>Item</em> che rappresentato rispettivamente la <em>PartitionKey</em> e la <em>RowKey</em> del <em>Table Storage</em> su Azure. Modifichiamo il file <em>Project.json</em> commentando la voce <em>aspnetcore50</em> nella sezione frameworks:</p> <p><a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/ASP.NET-5-e-AzureTableStorage_12A85/image_6.png"><img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/ASP.NET-5-e-AzureTableStorage_12A85/image_thumb_2.png" width="244" height="136" /></a></p> <p>La classe <em>Item</em> modificata è la seguente:</p> <div id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:670be0b5-84a3-4f04-9dc1-58a7b1edaad9" class="wlWriterEditableSmartContent" style="float: none; padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px"><pre style=" width: 503px; height: 133px;background-color:White;white-space:-moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; white-space: pre-wrap; word-wrap: break-word;overflow: auto;"><div><!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --><span style="color: #008080;">1</span> <span style="color: #000000;"> </span><span style="color: #0000FF;">public</span><span style="color: #000000;"> </span><span style="color: #0000FF;">class</span><span style="color: #000000;"> Item </span><span style="color: #008080;">2</span> <span style="color: #000000;"> { </span><span style="color: #008080;">3</span> <span style="color: #000000;"> </span><span style="color: #0000FF;">public</span><span style="color: #000000;"> </span><span style="color: #0000FF;">int</span><span style="color: #000000;"> Id { </span><span style="color: #0000FF;">get</span><span style="color: #000000;">; </span><span style="color: #0000FF;">set</span><span style="color: #000000;">; } </span><span style="color: #008080;">4</span> <span style="color: #000000;"> </span><span style="color: #0000FF;">public</span><span style="color: #000000;"> </span><span style="color: #0000FF;">int</span><span style="color: #000000;"> CategoryId { </span><span style="color: #0000FF;">get</span><span style="color: #000000;">; </span><span style="color: #0000FF;">set</span><span style="color: #000000;">; } </span><span style="color: #008080;">5</span> <span style="color: #000000;"> </span><span style="color: #0000FF;">public</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> Code { </span><span style="color: #0000FF;">get</span><span style="color: #000000;">; </span><span style="color: #0000FF;">set</span><span style="color: #000000;">; } </span><span style="color: #008080;">6</span> <span style="color: #000000;"> </span><span style="color: #0000FF;">public</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> Description { </span><span style="color: #0000FF;">get</span><span style="color: #000000;">; </span><span style="color: #0000FF;">set</span><span style="color: #000000;">; } </span><span style="color: #008080;">7</span> <span style="color: #000000;"> }</span></div></pre><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin. http://dunnhq.com --></div> <p>Infine modifichiamo la classe <em>Program.cs</em>:</p> <p> </p><div id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:39117039-548a-45de-ae40-9252b10f3597" class="wlWriterEditableSmartContent" style="float: none; padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px"><pre style=" width: 810px; height: 470px;background-color:White;white-space:-moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; white-space: pre-wrap; word-wrap: break-word;overflow: auto;"><div><!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --><span style="color: #008080;"> 1</span> <span style="color: #000000;"> </span><span style="color: #0000FF;">public</span><span style="color: #000000;"> </span><span style="color: #0000FF;">void</span><span style="color: #000000;"> Main(</span><span style="color: #0000FF;">string</span><span style="color: #000000;">[] args) </span><span style="color: #008080;"> 2</span> <span style="color: #000000;"> { </span><span style="color: #008080;"> 3</span> <span style="color: #000000;"> </span><span style="color: #0000FF;">using</span><span style="color: #000000;"> (ItemDB db </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> ItemDB()) </span><span style="color: #008080;"> 4</span> <span style="color: #000000;"> { </span><span style="color: #008080;"> 5</span> <span style="color: #000000;"> </span><span style="color: #0000FF;">int</span><span style="color: #000000;"> nextId </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> Random().Next(</span><span style="color: #800080;">100000</span><span style="color: #000000;">); </span><span style="color: #008080;"> 6</span> <span style="color: #000000;"> </span><span style="color: #008080;"> 7</span> <span style="color: #000000;"> db.Items.Add(</span><span style="color: #0000FF;">new</span><span style="color: #000000;"> Item() </span><span style="color: #008080;"> 8</span> <span style="color: #000000;"> { </span><span style="color: #008080;"> 9</span> <span style="color: #000000;"> Id </span><span style="color: #000000;">=</span><span style="color: #000000;"> nextId, </span><span style="color: #008080;">10</span> <span style="color: #000000;"> Code </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">Item #</span><span style="color: #800000;">"</span><span style="color: #000000;"> </span><span style="color: #000000;">+</span><span style="color: #000000;"> nextId, </span><span style="color: #008080;">11</span> <span style="color: #000000;"> Description </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">Description #</span><span style="color: #800000;">"</span><span style="color: #000000;"> </span><span style="color: #000000;">+</span><span style="color: #000000;"> nextId </span><span style="color: #008080;">12</span> <span style="color: #000000;"> }); </span><span style="color: #008080;">13</span> <span style="color: #000000;"> </span><span style="color: #008080;">14</span> <span style="color: #000000;"> db.SaveChanges(); </span><span style="color: #008080;">15</span> <span style="color: #000000;"> } </span><span style="color: #008080;">16</span> <span style="color: #000000;"> </span><span style="color: #008080;">17</span> <span style="color: #000000;"> </span><span style="color: #0000FF;">using</span><span style="color: #000000;"> (ItemDB db </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> ItemDB()) </span><span style="color: #008080;">18</span> <span style="color: #000000;"> { </span><span style="color: #008080;">19</span> <span style="color: #000000;"> </span><span style="color: #0000FF;">foreach</span><span style="color: #000000;"> (Item item </span><span style="color: #0000FF;">in</span><span style="color: #000000;"> db.Items) </span><span style="color: #008080;">20</span> <span style="color: #000000;"> { </span><span style="color: #008080;">21</span> <span style="color: #000000;"> Console.WriteLine(</span><span style="color: #800000;">"</span><span style="color: #800000;">Item Id: {0}, Code: {1}, Description : {2}</span><span style="color: #800000;">"</span><span style="color: #000000;">, </span><span style="color: #008080;">22</span> <span style="color: #000000;"> item.Id, item.Code, item.Description); </span><span style="color: #008080;">23</span> <span style="color: #000000;"> } </span><span style="color: #008080;">24</span> <span style="color: #000000;"> } </span><span style="color: #008080;">25</span> <span style="color: #000000;"> </span><span style="color: #008080;">26</span> <span style="color: #000000;"> Console.ReadLine(); </span><span style="color: #008080;">27</span> <span style="color: #000000;"> }</span></div></pre><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin. http://dunnhq.com --></div> <p>Proviamo quindi ad eseguire l’applicazione:</p> <p><a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/ASP.NET-5-e-AzureTableStorage_12A85/image_8.png"><img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/ASP.NET-5-e-AzureTableStorage_12A85/image_thumb_3.png" width="244" height="126" /></a></p> <p>Ulteriore prova che tutto funzioni correttamente si puo’ avere utizzando <a href="https://azurestorageexplorer.codeplex.com/" target="_blank">l’”Azure Storage Explorer”</a>:</p> <p><a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/ASP.NET-5-e-AzureTableStorage_12A85/image_10.png"><img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/ASP.NET-5-e-AzureTableStorage_12A85/image_thumb_4.png" width="244" height="95" /></a></p><img src="http://blogs.ugidotnet.org/PietroLibroBlog/aggbug/101909.aspx" width="1" height="1" /> Pietro Libro http://blogs.ugidotnet.org/PietroLibroBlog/archive/2014/11/30/asp.net-5-e-azuretablestorage.aspx Sun, 30 Nov 2014 23:48:00 GMT http://blogs.ugidotnet.org/PietroLibroBlog/archive/2014/11/30/asp.net-5-e-azuretablestorage.aspx#feedback http://blogs.ugidotnet.org/PietroLibroBlog/comments/commentRss/101909.aspx http://blogs.ugidotnet.org/PietroLibroBlog/services/trackbacks/101909.aspx ASP.NET 5 e Entity Framework 7 (beta) ASP.NET 5 Visual Studio 2015 Entity Framework 7 http://blogs.ugidotnet.org/PietroLibroBlog/archive/2014/11/30/asp.net-5-e-entity-framework-7-beta.aspx <p>Vediamo in questo post come iniziare a giocare con Entity Framework 7 “beta” (in “beta” solo per uniformità con in rilascio della preview di VS 2015, cosi come descritto in questo <a href="http://blogs.msdn.com/b/adonet/archive/2014/11/12/visual-studio-2015-preview-and-entity-framework.aspx" target="_blank">post</a>). Partiamo con aprire VS 2015 e creare un progetto di tipo “ASP.NET 5 Console Application”:</p> <p><a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/MVC6-e-Entity-Framework-7_10E1E/image_6.png"><img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/MVC6-e-Entity-Framework-7_10E1E/image_thumb_2.png" width="244" height="170" /></a></p> <p>Per utilizzare Entity Framework 7, apriamo il file <em>Project.json</em> e aggiungiamo nella sezione <em>dependencies</em> le tre dipendenze seguenti:</p> <ol> <li>"EntityFramework": "7.0.0-beta1"</li> <li>"EntityFramework.Commands" : "7.0.0-beta1"</li> <li>"EntityFramework.SqlServer": "7.0.0-beta1"</li> </ol> <p>Le dipendenze 1 e 3 ci servono per integrare EF nel nostro progetto ed “informare” che andremo a lavorare utilizzando EF per SQL Server (dato che nella nuova versione, il provider di EF puo’ essere utilzzato nativamente per interagire con <em>SqlServer</em>, <em>SqlLite</em>, <em>AzureTableStorage</em> e <em>InMemory</em>, quindi non solo database relazionali), la dipendenza 3 ci serve per utilizzare i comandi di <em>DB Migration</em> all’interno del nostro progetto.</p> <p>Sempre in <em>Project.json</em> aggiungiamo la sezione <em>Commands</em> con la relativa voce “EF”:</p> <p>"commands": { <br />    "ef": "EntityFramework.Commands" <br />}, <br /></p> <p> </p> <p>Cosi’ che alla fine delle modifiche il file <em>Project.json</em> sia simile a quanto illustrato nella figura seguente:</p> <p><a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/MVC6-e-Entity-Framework-7_10E1E/image_28.png"><img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/MVC6-e-Entity-Framework-7_10E1E/image_thumb_13.png" width="244" height="165" /></a></p> <p> <br />Aggiungiamo al progetto un file di tipo “ASP.NET Configuration file” (<em>Config.json</em>):</p> <p><a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/MVC6-e-Entity-Framework-7_10E1E/image_10.png"><img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/MVC6-e-Entity-Framework-7_10E1E/image_thumb_4.png" width="244" height="170" /></a></p> <p>Il quale di Default si presenta in questo modo:</p> <p><a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/MVC6-e-Entity-Framework-7_10E1E/image_12.png"><img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/MVC6-e-Entity-Framework-7_10E1E/image_thumb_5.png" width="244" height="44" /></a></p> <p>Nella sezione “Data\DefaultConnection” modifichiamo la voce <em>ConnectionString</em> editando la propietà <em>Database</em> oppure cambiando l’intera stringa di connessione, secondo di dove vogliamo ospitare il nostro database (Istanza di SQL Server Express piuttosto che LocalDB ad esempio). Tramite “NuGet Package Manager” (molto piu’ carino graficamente di quello precedente), aggiungiamo un riferimento al Package “Microsoft.Framework.ConfigurationModel.Json” :</p> <p><a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/MVC6-e-Entity-Framework-7_10E1E/image_14.png"><img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/MVC6-e-Entity-Framework-7_10E1E/image_thumb_6.png" width="244" height="120" /></a></p> <p>Aggiungiamo al progetto il file <em>Startup.cs</em>:</p> <p><a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/MVC6-e-Entity-Framework-7_10E1E/image_22.png"><img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/MVC6-e-Entity-Framework-7_10E1E/image_thumb_10.png" width="244" height="170" /></a></p> <p>E modifichiamolo come segue:</p> <div id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:8620001f-96b5-4991-9017-2083cf6e37d2" class="wlWriterEditableSmartContent" style="float: none; padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px"><pre style=" width: 938px; height: 191px;background-color:White;white-space:-moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; white-space: pre-wrap; word-wrap: break-word;overflow: auto;"><div><!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --><span style="color: #008080;"> 1</span> <span style="color: #000000;"> </span><span style="color: #0000FF;">public</span><span style="color: #000000;"> </span><span style="color: #0000FF;">class</span><span style="color: #000000;"> Startup </span><span style="color: #008080;"> 2</span> <span style="color: #000000;"> { </span><span style="color: #008080;"> 3</span> <span style="color: #000000;"> </span><span style="color: #0000FF;">public</span><span style="color: #000000;"> </span><span style="color: #0000FF;">static</span><span style="color: #000000;"> Microsoft.Framework.ConfigurationModel.IConfiguration Configuration { </span><span style="color: #0000FF;">get</span><span style="color: #000000;">; </span><span style="color: #0000FF;">set</span><span style="color: #000000;">; } </span><span style="color: #008080;"> 4</span> <span style="color: #000000;"> </span><span style="color: #008080;"> 5</span> <span style="color: #000000;"> </span><span style="color: #0000FF;">static</span><span style="color: #000000;"> Startup() </span><span style="color: #008080;"> 6</span> <span style="color: #000000;"> { </span><span style="color: #008080;"> 7</span> <span style="color: #000000;"> Configuration </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> Microsoft.Framework.ConfigurationModel.Configuration() </span><span style="color: #008080;"> 8</span> <span style="color: #000000;"> .AddJsonFile(</span><span style="color: #800000;">"</span><span style="color: #800000;">config.json</span><span style="color: #800000;">"</span><span style="color: #000000;">).AddEnvironmentVariables(); </span><span style="color: #008080;"> 9</span> <span style="color: #000000;"> } </span><span style="color: #008080;">10</span> <span style="color: #000000;"> }</span></div></pre><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin. http://dunnhq.com --></div> <p>Aggiungiamo al progetto due nuovi classi C#, “Item” e “ItemDB”, dove “ItemDB” è la classe derivata da <em>System.Data.Entity.DbContext</em> ed “Item” il <em>Data Model</em>:</p> <div id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:354721b5-c166-4535-a2b5-b9c53668d10b" class="wlWriterEditableSmartContent" style="float: none; padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px"><pre style=" width: 938px; height: 282px;background-color:White;white-space:-moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; white-space: pre-wrap; word-wrap: break-word;overflow: auto;"><div><!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --><span style="color: #008080;"> 1</span> <span style="color: #000000;"> </span><span style="color: #0000FF;">public</span><span style="color: #000000;"> </span><span style="color: #0000FF;">class</span><span style="color: #000000;"> Item </span><span style="color: #008080;"> 2</span> <span style="color: #000000;"> { </span><span style="color: #008080;"> 3</span> <span style="color: #000000;"> </span><span style="color: #0000FF;">public</span><span style="color: #000000;"> </span><span style="color: #0000FF;">int</span><span style="color: #000000;"> Id { </span><span style="color: #0000FF;">get</span><span style="color: #000000;">; </span><span style="color: #0000FF;">set</span><span style="color: #000000;">; } </span><span style="color: #008080;"> 4</span> <span style="color: #000000;"> </span><span style="color: #0000FF;">public</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> Code { </span><span style="color: #0000FF;">get</span><span style="color: #000000;">; </span><span style="color: #0000FF;">set</span><span style="color: #000000;">; } </span><span style="color: #008080;"> 5</span> <span style="color: #000000;"> </span><span style="color: #0000FF;">public</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> Description { </span><span style="color: #0000FF;">get</span><span style="color: #000000;">; </span><span style="color: #0000FF;">set</span><span style="color: #000000;">; } </span><span style="color: #008080;"> 6</span> <span style="color: #000000;"> } </span><span style="color: #008080;"> 7</span> <span style="color: #000000;"> </span><span style="color: #008080;"> 8</span> <span style="color: #000000;"> </span><span style="color: #0000FF;">public</span><span style="color: #000000;"> </span><span style="color: #0000FF;">class</span><span style="color: #000000;"> ItemDB : DbContext </span><span style="color: #008080;"> 9</span> <span style="color: #000000;"> { </span><span style="color: #008080;">10</span> <span style="color: #000000;"> </span><span style="color: #0000FF;">public</span><span style="color: #000000;"> DbSet</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">Item</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"> Items { </span><span style="color: #0000FF;">get</span><span style="color: #000000;">; </span><span style="color: #0000FF;">set</span><span style="color: #000000;">; } </span><span style="color: #008080;">11</span> <span style="color: #000000;"> </span><span style="color: #008080;">12</span> <span style="color: #000000;"> </span><span style="color: #0000FF;">protected</span><span style="color: #000000;"> </span><span style="color: #0000FF;">override</span><span style="color: #000000;"> </span><span style="color: #0000FF;">void</span><span style="color: #000000;"> OnConfiguring(DbContextOptions options) </span><span style="color: #008080;">13</span> <span style="color: #000000;"> { </span><span style="color: #008080;">14</span> <span style="color: #000000;"> options.UseSqlServer(Startup.Configuration.Get(</span><span style="color: #800000;">"</span><span style="color: #800000;">Data:DefaultConnection:ConnectionString</span><span style="color: #800000;">"</span><span style="color: #000000;">)); </span><span style="color: #008080;">15</span> <span style="color: #000000;"> } </span><span style="color: #008080;">16</span> <span style="color: #000000;"> }</span></div></pre><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin. http://dunnhq.com --></div> <p>Il nuovo metodo <em>OnConfigure</em> di cui abbiamo eseguito <em>l’override</em> ci permette di specificare quale <em>Data Provider</em> (nel nostro caso SqlServer) lavorerà con il nostro <em>DbContext</em>. <em>UseSqlServer</em> accetta come parametro  una stringa di connessione che recuperiamo dal file <em>Config.json</em> tramite la proprietà <em>Configuration</em> (<em>Microsoft.Framework.ConfigurationModel.IConfiguration</em>) presente nella classe <em>Startup.cs</em>.</p> <p>Per utilizzare EF Migrations, non è ancora finita, in quanto è necessario installare e configurare KVM (<a href="https://github.com/aspnet/Home/wiki/version-manager" target="_blank">K Version Manager</a>), sul sito è presente una piccola guida all’installazione. </p> <p>Apriamo un’istanza di Windows PowerShell (o Command Prompt secondo le preferenze) e ci spostiamo nella directory del nostro progetto, dopo digitiamo il comando “K ef migration add initial”:</p> <p><a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/MVC6-e-Entity-Framework-7_10E1E/image_16.png"><img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/MVC6-e-Entity-Framework-7_10E1E/image_thumb_7.png" width="244" height="18" /></a></p> <p>Se tutto è stato eseguito correttamente, nel nostro progetto viene aggiunta la classica cartella “Migrations” con tutti i file necessari:</p> <p><a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/MVC6-e-Entity-Framework-7_10E1E/image_24.png"><img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/MVC6-e-Entity-Framework-7_10E1E/image_thumb_11.png" width="244" height="168" /></a></p> <p>Applichiamo quindi il nostro “piano di migrazione” tramite il comando “migration apply”:</p> <p><a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/MVC6-e-Entity-Framework-7_10E1E/image_20.png"><img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/MVC6-e-Entity-Framework-7_10E1E/image_thumb_9.png" width="244" height="21" /></a></p> <p>Ora possiamo testare che tutto <em>l’Ambaradan </em>(<img class="wlEmoticon wlEmoticon-smile" style="border-top-style: none; border-bottom-style: none; border-right-style: none; border-left-style: none" alt="Smile" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/MVC6-e-Entity-Framework-7_10E1E/wlEmoticon-smile_2.png" />) funzioni, modificando la classe <em>Programs.cs</em> in questo modo:</p> <div id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:23d1cb5a-b83b-4310-a467-63b1e4d336e2" class="wlWriterEditableSmartContent" style="float: none; padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px"><pre style=" width: 938px; height: 460px;background-color:White;white-space:-moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; white-space: pre-wrap; word-wrap: break-word;overflow: auto;"><div><!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --><span style="color: #008080;"> 1</span> <span style="color: #000000;"> </span><span style="color: #0000FF;">public</span><span style="color: #000000;"> </span><span style="color: #0000FF;">void</span><span style="color: #000000;"> Main(</span><span style="color: #0000FF;">string</span><span style="color: #000000;">[] args) </span><span style="color: #008080;"> 2</span> <span style="color: #000000;"> { </span><span style="color: #008080;"> 3</span> <span style="color: #000000;"> </span><span style="color: #808080;">///</span><span style="color: #008000;">/Save data.</span><span style="color: #808080;"> </span><span style="color: #008080;"> 4</span> <span style="color: #808080;" /><span style="color: #000000;"> </span><span style="color: #0000FF;">using</span><span style="color: #000000;"> (ItemDB db </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> ItemDB()) </span><span style="color: #008080;"> 5</span> <span style="color: #000000;"> { </span><span style="color: #008080;"> 6</span> <span style="color: #000000;"> db.Items.Add(</span><span style="color: #0000FF;">new</span><span style="color: #000000;"> Item() </span><span style="color: #008080;"> 7</span> <span style="color: #000000;"> { </span><span style="color: #008080;"> 8</span> <span style="color: #000000;"> Code </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">Item #1</span><span style="color: #800000;">"</span><span style="color: #000000;">, </span><span style="color: #008080;"> 9</span> <span style="color: #000000;"> Description </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">Description #1</span><span style="color: #800000;">"</span><span style="color: #000000;"> </span><span style="color: #008080;">10</span> <span style="color: #000000;"> }); </span><span style="color: #008080;">11</span> <span style="color: #000000;"> </span><span style="color: #008080;">12</span> <span style="color: #000000;"> db.SaveChanges(); </span><span style="color: #008080;">13</span> <span style="color: #000000;"> } </span><span style="color: #008080;">14</span> <span style="color: #000000;"> </span><span style="color: #008080;">15</span> <span style="color: #000000;"> </span><span style="color: #808080;">///</span><span style="color: #008000;">/Load data.</span><span style="color: #808080;"> </span><span style="color: #008080;">16</span> <span style="color: #808080;" /><span style="color: #000000;"> </span><span style="color: #0000FF;">using</span><span style="color: #000000;"> (ItemDB db </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> ItemDB()) </span><span style="color: #008080;">17</span> <span style="color: #000000;"> { </span><span style="color: #008080;">18</span> <span style="color: #000000;"> </span><span style="color: #0000FF;">foreach</span><span style="color: #000000;"> (Item item </span><span style="color: #0000FF;">in</span><span style="color: #000000;"> db.Items) </span><span style="color: #008080;">19</span> <span style="color: #000000;"> { </span><span style="color: #008080;">20</span> <span style="color: #000000;"> Console.WriteLine(</span><span style="color: #800000;">"</span><span style="color: #800000;">Item Id: {0}, Code: {1}, Description : {2}</span><span style="color: #800000;">"</span><span style="color: #000000;">, </span><span style="color: #008080;">21</span> <span style="color: #000000;"> item.Id, item.Code, item.Description); </span><span style="color: #008080;">22</span> <span style="color: #000000;"> } </span><span style="color: #008080;">23</span> <span style="color: #000000;"> } </span><span style="color: #008080;">24</span> <span style="color: #000000;"> </span><span style="color: #008080;">25</span> <span style="color: #000000;"> Console.ReadLine(); </span><span style="color: #008080;">26</span> <span style="color: #000000;"> }</span></div></pre><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin. http://dunnhq.com --></div> <p>E poi avviando il tutto con un bel F5:</p> <p><a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/MVC6-e-Entity-Framework-7_10E1E/image_26.png"><img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/MVC6-e-Entity-Framework-7_10E1E/image_thumb_12.png" width="244" height="126" /></a></p> <p>Sicuramente la versione 7 di EF è ancora “poco” matura per essere utiizzata in progetti reali, ma questo esempio vuole essere un punto di partenza per scoprire quali novità ci attendono <img class="wlEmoticon wlEmoticon-smile" style="border-top-style: none; border-bottom-style: none; border-right-style: none; border-left-style: none" alt="Smile" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/MVC6-e-Entity-Framework-7_10E1E/wlEmoticon-smile_2.png" /></p><img src="http://blogs.ugidotnet.org/PietroLibroBlog/aggbug/101908.aspx" width="1" height="1" /> Pietro Libro http://blogs.ugidotnet.org/PietroLibroBlog/archive/2014/11/30/asp.net-5-e-entity-framework-7-beta.aspx Sun, 30 Nov 2014 13:21:00 GMT http://blogs.ugidotnet.org/PietroLibroBlog/archive/2014/11/30/asp.net-5-e-entity-framework-7-beta.aspx#feedback http://blogs.ugidotnet.org/PietroLibroBlog/comments/commentRss/101908.aspx http://blogs.ugidotnet.org/PietroLibroBlog/services/trackbacks/101908.aspx Asp.Net 5, MVC 6 e Web Api ASP.NET 5 ASP.NET Web Api MVC 6 http://blogs.ugidotnet.org/PietroLibroBlog/archive/2014/11/23/asp.net-5-mvc-6-e-web-api.aspx <p>E’ qualche mese che non scrivo nulla sul blog, ma gli studi, come la vita, sono andata avanti. Ora eccoci qui a fare qualche test con le nuove versioni delle ultime tecnologie\framework web del mondo Microsoft, che ci regala ogni giorno qualcosa di tecnlogicamente fantastico…alla faccia dei soliti criticoni <img class="wlEmoticon wlEmoticon-smile" style="border-top-style: none; border-bottom-style: none; border-right-style: none; border-left-style: none" alt="Smile" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/AspNet-5-MVC-6-Web-Api_112BD/wlEmoticon-smile_2.png" />. Torniamo con i piedi per terra e proviamo ad utilizzare le Web Api in un progetto MVC 6 (attualmente in versione beta, ASP.NET 5 fonde i framework MCV e Web Api). Apriamo il nostro VS 2015 preview (scaricabile nella versione ultimate a questo indirizzo: ) e creiamo un nuovo progetto “ASP.NET Web Application”:</p> <p><a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/AspNet-5-MVC-6-Web-Api_112BD/image_4.png"><img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/AspNet-5-MVC-6-Web-Api_112BD/image_thumb_1.png" width="244" height="170" /></a></p> <p>Poi selezioniamo il template <em>ASP.NET 5 Empty</em>:</p> <p><a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/AspNet-5-MVC-6-Web-Api_112BD/image_8.png"><img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/AspNet-5-MVC-6-Web-Api_112BD/image_thumb_3.png" width="244" height="183" /></a></p> <p>Attendiamo qualche secondo che Visual Studio crei l’alberatura della soluzione con tutti i relativi file:</p> <p><a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/AspNet-5-MVC-6-Web-Api_112BD/image_10.png"><img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/AspNet-5-MVC-6-Web-Api_112BD/image_thumb_4.png" width="244" height="195" /></a></p> <p>Notiamo due file in formato “.json”, <em>global.json</em> e <em>project.json</em>, che possiamo editare rispettivamente per i <em>settings</em> e per le <em>references</em> a livello globale (solution) o di singolo progetto. La classe <em>Startup.cs</em> ed in particolare il metodo <em>Configure(…)</em> definisce l’entry point della pipeline di ASP.NET, ed è qui che andremo ad aggiungere il codice necessario all’esecuzione dell’applicazione. Prima, apriamo il file <em>project.json</em>, e nella sezione <em>dependencies </em>aggiungiamo la riga seguente:</p> <div id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:31fa74eb-3a4e-4854-8d55-ea86cd323d50" class="wlWriterEditableSmartContent" style="float: none; padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px"><pre class="brush: csharp; gutter: true; first-line: 1; tab-size: 4; toolbar: false; width: 422px; height: 22px;" style=" width: 422px; height: 22px;overflow: auto;">"Microsoft.AspNet.Mvc": "6.0.0-beta1"</pre><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin. http://dunnhq.com --></div> <p>Notare come l’editor sia completo di <em>IntelliSense </em>che ci permette di scegliere dinamicamente package e versione (tra quelle disponibili):</p> <p><a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/AspNet-5-MVC-6-Web-Api_112BD/image_12.png"><img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/AspNet-5-MVC-6-Web-Api_112BD/image_thumb_5.png" width="244" height="116" /></a></p> <p>Inizializziamo MVC nella classe <em>Startup.cs</em>, aggiungendo il metodo <em>ConfigureServices</em>:</p> <div id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:400b0b3f-550e-45e9-a8dc-b48fde71e3c8" class="wlWriterEditableSmartContent" style="float: none; padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px"><pre style=" width: 574px; height: 79px;background-color:White;white-space:-moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; white-space: pre-wrap; word-wrap: break-word;overflow: auto;"><div><!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --><span style="color: #008080;">1</span> <span style="color: #0000FF;">public</span><span style="color: #000000;"> </span><span style="color: #0000FF;">void</span><span style="color: #000000;"> ConfigureServices(IServiceCollection services) </span><span style="color: #008080;">2</span> <span style="color: #000000;">{ </span><span style="color: #008080;">3</span> <span style="color: #000000;"> services.AddMvc(); </span><span style="color: #008080;">4</span> <span style="color: #000000;">}</span></div></pre><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin. http://dunnhq.com --></div> <p>il quale aggiunge tutte le dipendenze di cui MVC 6 ha bisogno. Utilizziamo il metodo d’estensione <em>UseMvc </em>nel metodo <em>Configure:</em></p> <div id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:133d9ce7-f372-4822-b58e-2673ebd60673" class="wlWriterEditableSmartContent" style="float: none; padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px"><pre style=" width: 574px; height: 79px;background-color:White;white-space:-moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; white-space: pre-wrap; word-wrap: break-word;overflow: auto;"><div><!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --><span style="color: #008080;">1</span> <span style="color: #0000FF;">public</span><span style="color: #000000;"> </span><span style="color: #0000FF;">void</span><span style="color: #000000;"> Configure(IApplicationBuilder app) </span><span style="color: #008080;">2</span> <span style="color: #000000;">{ </span><span style="color: #008080;">3</span> <span style="color: #000000;"> app.UseMvc(); </span><span style="color: #008080;">4</span> <span style="color: #000000;">} </span></div></pre><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin. http://dunnhq.com --></div> <p>Aggiungiamo una classe <em>ItemsController </em>(“Web Api Controller Class”) nella classica cartella di progetto <em>Controllers</em>:</p> <p><a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/AspNet-5-MVC-6-Web-Api_112BD/image_14.png"><img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/AspNet-5-MVC-6-Web-Api_112BD/image_thumb_6.png" width="244" height="170" /></a></p> <div id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:52bc49db-9ffe-4a96-aece-068adc238076" class="wlWriterEditableSmartContent" style="float: none; padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px"><pre style=" width: 782px; height: 226px;background-color:White;white-space:-moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; white-space: pre-wrap; word-wrap: break-word;overflow: auto;"><div><!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --><span style="color: #008080;"> 1</span> <span style="color: #000000;">[Route(</span><span style="color: #800000;">"</span><span style="color: #800000;">api/[controller]</span><span style="color: #800000;">"</span><span style="color: #000000;">)] </span><span style="color: #008080;"> 2</span> <span style="color: #000000;" /><span style="color: #0000FF;">public</span><span style="color: #000000;"> </span><span style="color: #0000FF;">class</span><span style="color: #000000;"> ItemsController : Controller </span><span style="color: #008080;"> 3</span> <span style="color: #000000;">{ </span><span style="color: #008080;"> 4</span> <span style="color: #000000;"> </span><span style="color: #008000;">//</span><span style="color: #008000;"> GET: api/values </span><span style="color: #008000;"> </span><span style="color: #008080;"> 5</span> <span style="color: #008000;" /><span style="color: #000000;"> [HttpGet] </span><span style="color: #008080;"> 6</span> <span style="color: #000000;"> </span><span style="color: #0000FF;">public</span><span style="color: #000000;"> IEnumerable</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">Item</span><span style="color: #000000;">&gt;</span><span style="color: #000000;"> Get() </span><span style="color: #008080;"> 7</span> <span style="color: #000000;"> { </span><span style="color: #008080;"> 8</span> <span style="color: #000000;"> </span><span style="color: #0000FF;">return</span><span style="color: #000000;"> </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> List</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">Item</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">( </span><span style="color: #008080;"> 9</span> <span style="color: #000000;"> </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> Item[]{ </span><span style="color: #008080;">10</span> <span style="color: #000000;"> </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> Item() { Code</span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">Item#1</span><span style="color: #800000;">"</span><span style="color: #000000;">, Description</span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">Item_Description#1</span><span style="color: #800000;">"</span><span style="color: #000000;"> }, </span><span style="color: #008080;">11</span> <span style="color: #000000;"> </span><span style="color: #0000FF;">new</span><span style="color: #000000;"> Item() { Code </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">Item2</span><span style="color: #800000;">"</span><span style="color: #000000;">, Description </span><span style="color: #000000;">=</span><span style="color: #000000;"> </span><span style="color: #800000;">"</span><span style="color: #800000;">Item_Description#2</span><span style="color: #800000;">"</span><span style="color: #000000;">} }); </span><span style="color: #008080;">12</span> <span style="color: #000000;"> } </span><span style="color: #008080;">13</span> <span style="color: #000000;">}</span></div></pre><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin. http://dunnhq.com --></div> <p>Poi aggiungiamo la classe <em>Item</em>:</p> <div id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:8bef8468-3a84-4e1b-b9c2-e6cdc95b167b" class="wlWriterEditableSmartContent" style="float: none; padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px"><pre style=" width: 467px; height: 92px;background-color:White;white-space:-moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; white-space: pre-wrap; word-wrap: break-word;overflow: auto;"><div><!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --><span style="color: #008080;">1</span> <span style="color: #0000FF;">public</span><span style="color: #000000;"> </span><span style="color: #0000FF;">class</span><span style="color: #000000;"> Item </span><span style="color: #008080;">2</span> <span style="color: #000000;">{ </span><span style="color: #008080;">3</span> <span style="color: #000000;"> </span><span style="color: #0000FF;">public</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> Code { </span><span style="color: #0000FF;">get</span><span style="color: #000000;">; </span><span style="color: #0000FF;">set</span><span style="color: #000000;">; } </span><span style="color: #008080;">4</span> <span style="color: #000000;"> </span><span style="color: #0000FF;">public</span><span style="color: #000000;"> </span><span style="color: #0000FF;">string</span><span style="color: #000000;"> Description { </span><span style="color: #0000FF;">get</span><span style="color: #000000;">; </span><span style="color: #0000FF;">set</span><span style="color: #000000;">; } </span><span style="color: #008080;">5</span> <span style="color: #000000;">}</span></div></pre><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin. http://dunnhq.com --></div> <p>Avviamo il progetto ed invochiamo via browser il servizio:</p> <p><a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/AspNet-5-MVC-6-Web-Api_112BD/image_16.png"><img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/AspNet-5-MVC-6-Web-Api_112BD/image_thumb_7.png" width="244" height="49" /></a></p> <p>Il servizio dovrebbe restituire il seguente json :</p> <div id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:6292c1a2-9f59-4ab1-acc2-227a4a001d03" class="wlWriterEditableSmartContent" style="float: none; padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px"><pre style=" width: 640px; height: 51px;background-color:White;white-space:-moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; white-space: pre-wrap; word-wrap: break-word;overflow: auto;"><div><!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --><span style="color: #008080;">1</span> <span style="color: #000000;">[{</span><span style="color: #800000;">"</span><span style="color: #800000;">Code</span><span style="color: #800000;">"</span><span style="color: #000000;">:</span><span style="color: #800000;">"</span><span style="color: #800000;">Item#1</span><span style="color: #800000;">"</span><span style="color: #000000;">,</span><span style="color: #800000;">"</span><span style="color: #800000;">Description</span><span style="color: #800000;">"</span><span style="color: #000000;">:</span><span style="color: #800000;">"</span><span style="color: #800000;">Item_Description#1</span><span style="color: #800000;">"</span><span style="color: #000000;">} </span><span style="color: #008080;">2</span> <span style="color: #000000;">,{</span><span style="color: #800000;">"</span><span style="color: #800000;">Code</span><span style="color: #800000;">"</span><span style="color: #000000;">:</span><span style="color: #800000;">"</span><span style="color: #800000;">Item2</span><span style="color: #800000;">"</span><span style="color: #000000;">,</span><span style="color: #800000;">"</span><span style="color: #800000;">Description</span><span style="color: #800000;">"</span><span style="color: #000000;">:</span><span style="color: #800000;">"</span><span style="color: #800000;">Item_Description#2</span><span style="color: #800000;">"</span><span style="color: #000000;">}]</span></div></pre><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin. http://dunnhq.com --></div> <p>Notiamo come la classe <em>ItemsController</em> a differenza delle versioni precedenti, non derivi piu’ dalla classe <em>ApiController</em>, ma direttamente da <em>Controller</em>. Se proviamo ad utilizzare uno strumento come <a href="http://www.telerik.com/fiddler" target="_blank">Fiddler</a> per analizzare le <em>request </em>e le <em>response </em>delle nostre Api, possiamo scoprire qualcosa di interessante, se ad esempio, modifichiamo la nostra Web Api in modo da tornare <em>null, c</em>on l’attuale versione di ASP.NET Web Api otterremmo:</p> <p><a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/AspNet-5-MVC-6-Web-Api_112BD/image_18.png"><img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/AspNet-5-MVC-6-Web-Api_112BD/image_thumb_8.png" width="244" height="56" /></a></p> <p>Ovvero una <em>response </em>con status 200 e corpo del messaggio vuoto, con la versione MVC 6 invece:</p> <p><a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/AspNet-5-MVC-6-Web-Api_112BD/image_20.png"><img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/AspNet-5-MVC-6-Web-Api_112BD/image_thumb_9.png" width="244" height="31" /></a></p> <p>Una <em>response </em>con status 204 (No Content), che logicamente parlando IMHO è piu’ corretta (la risposta è OK, ma il contenuto del body è vuoto). Ulteriori dettagli sui <em>Formatters</em> in MVC6 possono essere trovati in questo <a href="http://www.strathweb.com/2014/11/formatters-asp-net-mvc-6/" target="_blank">post</a> di Filip W. Per ritornare ad avere un comportamento <em>Old Style</em> è sufficiente agire a livello di configurazione, in <em>ConfigureServices</em>:</p> <div id="scid:9D7513F9-C04C-4721-824A-2B34F0212519:9cef9395-8948-42b0-8de5-e233c45d8634" class="wlWriterEditableSmartContent" style="float: none; padding-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; display: inline; padding-right: 0px"><pre style=" width: 781px; height: 92px;background-color:White;white-space:-moz-pre-wrap; white-space: -pre-wrap; white-space: -o-pre-wrap; white-space: pre-wrap; word-wrap: break-word;overflow: auto;"><div><!-- Code highlighting produced by Actipro CodeHighlighter (freeware) http://www.CodeHighlighter.com/ --><span style="color: #008080;">1</span> <span style="color: #0000FF;">public</span><span style="color: #000000;"> </span><span style="color: #0000FF;">void</span><span style="color: #000000;"> ConfigureServices(IServiceCollection services) </span><span style="color: #008080;">2</span> <span style="color: #000000;">{ </span><span style="color: #008080;">3</span> <span style="color: #000000;"> services.AddMvc().Configure</span><span style="color: #000000;">&lt;</span><span style="color: #000000;">MvcOptions</span><span style="color: #000000;">&gt;</span><span style="color: #000000;">(o </span><span style="color: #000000;">=&gt;</span><span style="color: #000000;"> o.OutputFormatters </span><span style="color: #008080;">4</span> <span style="color: #000000;"> .RemoveAll(f </span><span style="color: #000000;">=&gt;</span><span style="color: #000000;"> f.Instance.GetType() </span><span style="color: #000000;">==</span><span style="color: #000000;"> </span><span style="color: #0000FF;">typeof</span><span style="color: #000000;">(HttpNoContentOutputFormatter))); </span><span style="color: #008080;">5</span> <span style="color: #000000;">}</span></div></pre><!-- Code inserted with Steve Dunn's Windows Live Writer Code Formatter Plugin. http://dunnhq.com --></div> <p>Ovviamente di novità ci sono e tante, ma almeno sappiamo da dove iniziare <img class="wlEmoticon wlEmoticon-smile" style="border-top-style: none; border-bottom-style: none; border-right-style: none; border-left-style: none" alt="Smile" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/AspNet-5-MVC-6-Web-Api_112BD/wlEmoticon-smile_2.png" /> . </p><img src="http://blogs.ugidotnet.org/PietroLibroBlog/aggbug/101903.aspx" width="1" height="1" /> Pietro Libro http://blogs.ugidotnet.org/PietroLibroBlog/archive/2014/11/23/asp.net-5-mvc-6-e-web-api.aspx Sun, 23 Nov 2014 10:17:55 GMT http://blogs.ugidotnet.org/PietroLibroBlog/archive/2014/11/23/asp.net-5-mvc-6-e-web-api.aspx#feedback http://blogs.ugidotnet.org/PietroLibroBlog/comments/commentRss/101903.aspx http://blogs.ugidotnet.org/PietroLibroBlog/services/trackbacks/101903.aspx JSON.Merge .Net Framework 4.5 ASP.NET Web Api ASP.NET C# Varie ed eventuali Tools http://blogs.ugidotnet.org/PietroLibroBlog/archive/2014/08/29/json.merge.aspx <p>Un’interessante novità introdotta con la versione 6.0 release 4 di Json.NET è la possibilità di eseguire il <em>Merge</em> (utilizzando 4 possibili “variazioni”) di oggetti <em>JObject</em> e <em>Jarray</em>. Un rapido esempio, tramite Web Api:</p> <pre class="brush: csharp;">[HttpPost] public void JsonStringPost([FromBody]string value) { JObject jCar = JObject.Parse(value); JObject jOptional = JObject.Parse(@"{Optionals :['Air Conditioned','Smoker'] }"); jCar.Merge(jOptional, new JsonMergeSettings() { MergeArrayHandling = MergeArrayHandling.Union }); string jsonFormat = jCar.ToString(); Car mergedCar = jCar.ToObject&lt;Car&gt;(); }</pre> <p>Dove <em>l’Action</em> “JsonStringPost” accetta una stringa tipo:</p> <p>"{ 'Brand': 'Ferrari','Model': 'f450 Modena','Optionals': [] }"</p> <p>Utilizzando, ad esempio il <em>Composer</em> di strumenti come <a href="http://www.telerik.com/fiddler" target="_blank">Fiddler2</a> possiamo invocare il servizio:</p> <a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/JSON.Merge_A854/image_5.png"><img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; float: none; padding-top: 0px; padding-left: 0px; margin-left: auto; display: block; padding-right: 0px; border-top-width: 0px; margin-right: auto" border="0" alt="image" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/JSON.Merge_A854/image_thumb_1.png" width="244" height="238" /></a> <p>Per ottenere una nuova istanza di <em>Car</em> con tutti gli <em>Optionals</em>:</p> <p><a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/JSON.Merge_A854/image_7.png"><img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; float: none; padding-top: 0px; padding-left: 0px; margin-left: auto; display: block; padding-right: 0px; border-top-width: 0px; margin-right: auto" border="0" alt="image" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/JSON.Merge_A854/image_thumb_2.png" width="244" height="74" /></a></p> <p>Se il nostro servizio accetta direttamente un’istanza di oggetto invece di una stringa in formato JSON, il nostro codice cambia leggermente, come di seguito:</p> <pre class="brush: csharp;">[HttpPost] public void JsonObjectPost([FromBody] Car carByPost) { JObject jCar = JObject.FromObject(carByPost); JObject jOptional = JObject.Parse(@"{Optionals :['Air Conditioned','Smoker'] }"); jCar.Merge(jOptional, new JsonMergeSettings() { MergeArrayHandling = MergeArrayHandling.Union }); string jsonFormat = jCar.ToString(); Car mergedCar = jCar.ToObject<car>(); }</car></pre> <p>Dove utilizziamo il metodo <em>FromObject</em> della classe <em>JObject</em> invece di <em>Parse. </em>Utilizzando Fiddler, passando come <em>Body</em> del messaggio la stringa (senza i doppi apici ad inizio e fine stringa)</p> <p>{ 'Brand': 'Ferrari','Model': 'f450 Modena','Optionals': [] }</p> <p>Otteniamo (ovviamente) lo stesso risultato dell’invocazione precedente. E’ possibile modificare il comportamento di “Merge” utilizzando l’enumerazione <em>MergeArrayHandling. </em>La classe <em>Car </em>(C#) è descritta nell’esempio, è la seguente:</p> <pre class="brush: csharp;">public class Car { public string Brand { get; set; } public string Model { get; set; } public string[] Optionals { get; set; } }</pre> <p>La lista completa delle <em>features</em> aggiunte nel rilascio della versione 6.0 release 4 è disponibile <a href="http://james.newtonking.com/archive/2014/08/04/json-net-6-0-release-4-json-merge-dependency-injection" target="_blank">qui</a>.</p><img src="http://blogs.ugidotnet.org/PietroLibroBlog/aggbug/101880.aspx" width="1" height="1" /> Pietro Libro http://blogs.ugidotnet.org/PietroLibroBlog/archive/2014/08/29/json.merge.aspx Fri, 29 Aug 2014 13:30:00 GMT http://blogs.ugidotnet.org/PietroLibroBlog/archive/2014/08/29/json.merge.aspx#feedback http://blogs.ugidotnet.org/PietroLibroBlog/comments/commentRss/101880.aspx http://blogs.ugidotnet.org/PietroLibroBlog/services/trackbacks/101880.aspx EF 6.1 : What&rsquo;s new (3) Entity Framework 6 LINQ SQL SQL Server .Net Framework 4.5 C# Visual Studio 2013 http://blogs.ugidotnet.org/PietroLibroBlog/archive/2014/03/27/ef-6.1-whatrsquos-new-3.aspx <p>Supporto a “.ToString()” e “String.Concat()”, un esempio:</p> <pre class="csharpcode">var queryConcat = from c <span class="kwrd">in</span> db.Vehicles <span class="kwrd">where</span> <span class="kwrd">string</span>.Concat(c.EngineSize, c.HP).Equals(<span class="str">"1600110"</span>) select c; var queryToString = from c <span class="kwrd">in</span> db.Vehicles <span class="kwrd">where</span> c.HP.ToString().Equals(<span class="str">"110"</span>) select c;</pre> <style type="text/css"><![CDATA[ .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }]]></style> <p> </p> <p>Abbiamo due Query LINQ che filtrano i dati in base a condizioni su stringhe, la prima “tira fuori” tutti i veicoli dove la concatenazione dei valori delle proprietà “EngineSize” e “HP” è uguale a “1600110”, mentre la seconda esegue un filtro su di un valore intero convertio in stringa. Se proviamo ad eseguire il codice in un ambiente con EF 6.0 otteniamo un’eccezione a runtime in tutti e due i casi:</p> <p><a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/EF-6.1--Whats-new-3_7B13/image_2.png"><img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; float: none; padding-top: 0px; padding-left: 0px; margin-left: auto; border-left: 0px; display: block; padding-right: 0px; margin-right: auto" border="0" alt="image" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/EF-6.1--Whats-new-3_7B13/image_thumb.png" width="244" height="223" /></a></p> <p>Con EF 6.1 le query sono eseguite correttamente:</p> <p><a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/EF-6.1--Whats-new-3_7B13/image_4.png"><img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; float: none; padding-top: 0px; padding-left: 0px; margin-left: auto; border-left: 0px; display: block; padding-right: 0px; margin-right: auto" border="0" alt="image" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/EF-6.1--Whats-new-3_7B13/image_thumb_1.png" width="244" height="165" /></a></p> <p>Cosa succede dietro le quinte:</p> <pre class="csharpcode"><span class="kwrd">SELECT</span> [GroupBy1].[A1] <span class="kwrd">AS</span> [C1] <span class="kwrd">FROM</span> ( <span class="kwrd">SELECT</span> <span class="kwrd">COUNT</span>(1) <span class="kwrd">AS</span> [A1] <span class="kwrd">FROM</span> [DomusDotNet].[Vehicles] <span class="kwrd">AS</span> [Extent1] <span class="kwrd">WHERE</span> N<span class="str">'1600110'</span> = (<span class="kwrd">CASE</span> <span class="kwrd">WHEN</span> ([Extent1].[EngineSize] <span class="kwrd">IS</span> <span class="kwrd">NULL</span>) <span class="kwrd">THEN</span> N<span class="str">''</span> <span class="kwrd">ELSE</span> [Extent1].[EngineSize] <span class="kwrd">END</span> + <span class="kwrd">CAST</span>( [Extent1].[HP] <span class="kwrd">AS</span> nvarchar(<span class="kwrd">max</span>))) ) <span class="kwrd">AS</span> [GroupBy1] <span class="kwrd">SELECT</span> [GroupBy1].[A1] <span class="kwrd">AS</span> [C1] <span class="kwrd">FROM</span> ( <span class="kwrd">SELECT</span> <span class="kwrd">COUNT</span>(1) <span class="kwrd">AS</span> [A1] <span class="kwrd">FROM</span> [DomusDotNet].[Vehicles] <span class="kwrd">AS</span> [Extent1] <span class="kwrd">WHERE</span> N<span class="str">'110'</span> = <span class="kwrd">CAST</span>( [Extent1].[HP] <span class="kwrd">AS</span> nvarchar(<span class="kwrd">max</span>)) ) <span class="kwrd">AS</span> [GroupBy1]</pre> <style type="text/css"><![CDATA[ .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }]]></style> <p>Da analizzare il funzionamento di “String.Concat(…)” con SQL Server 2012 per verificare la conversione in SQL con la funzione “nativa SQL” “<a href="http://technet.microsoft.com/en-us/library/hh231515.aspx" target="_blank">Concat</a>”.</p><img src="http://blogs.ugidotnet.org/PietroLibroBlog/aggbug/101829.aspx" width="1" height="1" /> Pietro Libro http://blogs.ugidotnet.org/PietroLibroBlog/archive/2014/03/27/ef-6.1-whatrsquos-new-3.aspx Thu, 27 Mar 2014 10:04:00 GMT http://blogs.ugidotnet.org/PietroLibroBlog/archive/2014/03/27/ef-6.1-whatrsquos-new-3.aspx#feedback http://blogs.ugidotnet.org/PietroLibroBlog/comments/commentRss/101829.aspx http://blogs.ugidotnet.org/PietroLibroBlog/services/trackbacks/101829.aspx EF 6.1 : What&rsquo;s new (2) .Net Framework 4.5 C# Entity Framework 6 Visual Studio 2013 http://blogs.ugidotnet.org/PietroLibroBlog/archive/2014/03/20/ef-6.1-whatrsquos-new-2.aspx <p>Altra <em>feature </em>introdotta, l’attributo “IndexAttribute” che ci permette di definire un indice su una o piu’ colonne. Ad esempio, per creare un indice (di nome “IX_FreeDailyKm”) sulla proprietà “FreeDailyKm” del nostro modello, scriviamo:</p> <pre class="csharpcode">[Index(<span class="str">"IX_FreeDailyKm_Clustered"</span>, IsUnique = <span class="kwrd">false</span>, IsClustered = <span class="kwrd">false</span>)] <span class="kwrd">public</span> <span class="kwrd">int</span> FreeDailyKm { get; set; }</pre> <style type="text/css"><![CDATA[ .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }]]></style> <p> </p> <p>Mentre per creare un indice che insiste su due proprietà, è sufficiente utilizzare lo stesso nome come da esempio:</p> <pre class="csharpcode">[Index(<span class="str">"IX_Engine"</span>, 2)] <span class="kwrd">public</span> <span class="kwrd">string</span> EngineSize { get; set; } [Index(<span class="str">"IX_Engine"</span>, 1)] <span class="kwrd">public</span> <span class="kwrd">int</span> HP { get; set; }</pre> <style type="text/css"><![CDATA[ .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }]]></style> <p> </p> <p>Utilizzando <em>EF migrations</em> per aggiornare il database, avremmo:</p> <pre class="csharpcode">CreateIndex(<span class="str">"DomusDotNet.Vehicles"</span>, <span class="str">"FreeDailyKm"</span>, name: <span class="str">"IX_FreeDailyKm_Clustered"</span>); CreateIndex(<span class="str">"DomusDotNet.Vehicles"</span>, <span class="kwrd">new</span>[] { <span class="str">"HP"</span>, <span class="str">"EngineSize"</span> }, name: <span class="str">"IX_Engine"</span>);</pre> <style type="text/css"><![CDATA[ .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }]]></style> <p> </p> <p>Quindi, a livello di database:</p> <p><a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/EF-6.1--Whats-new-2_EA92/image_2.png"><img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; float: none; padding-top: 0px; padding-left: 0px; margin-left: auto; border-left: 0px; display: block; padding-right: 0px; margin-right: auto" border="0" alt="image" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/EF-6.1--Whats-new-2_EA92/image_thumb.png" width="244" height="55" /></a></p><img src="http://blogs.ugidotnet.org/PietroLibroBlog/aggbug/101825.aspx" width="1" height="1" /> Pietro Libro http://blogs.ugidotnet.org/PietroLibroBlog/archive/2014/03/20/ef-6.1-whatrsquos-new-2.aspx Thu, 20 Mar 2014 17:49:00 GMT http://blogs.ugidotnet.org/PietroLibroBlog/archive/2014/03/20/ef-6.1-whatrsquos-new-2.aspx#feedback http://blogs.ugidotnet.org/PietroLibroBlog/comments/commentRss/101825.aspx http://blogs.ugidotnet.org/PietroLibroBlog/services/trackbacks/101825.aspx EF 6.1 : What&rsquo;s new (1) .Net Framework 4.5 C# Entity Framework 6 Visual Studio 2013 http://blogs.ugidotnet.org/PietroLibroBlog/archive/2014/03/20/ef-6.1-whatrsquos-new-1.aspx <p>Da qualche giorno è stata rilasciata in RTM la <a href="http://blogs.msdn.com/b/adonet/archive/2014/03/17/ef6-1-0-rtm-available.aspx" target="_blank">versione 6.1.0</a> di Entity Framework. Una delle novità piu’ interessanti è sicuramente la possibilità di utilizzare l’approcio  <em>Code First </em>partendo da un database esistente (potrebbe sembrare strano, ma se pensiamo ad un nuovo sviluppo potrebbe non esserlo). I “ferri” da utilizzare sono ovviamente  EF 6.0.1 e la nuova versione di EF Tools, “scaricabile” per VS 2012 e VS 2013 seguendo <a href="http://www.microsoft.com/en-us/download/details.aspx?id=40762" target="_blank">questo</a> link.</p> <p>Per un semplice test, apriamo VS 2013 (o 2012), magari creando un semplice progetto “Console” al quale aggiungiamo tramite NuGet i riferimenti a EF 6.0.1. Poi tasto destro sul progetto e “Add New Item”, e scegliamo “ADO.NET Entity Data model”:</p> <p><a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/EF-6.1--Whats-new-1_9B2C/image_4.png"><img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; float: none; padding-top: 0px; padding-left: 0px; margin-left: auto; border-left: 0px; display: block; padding-right: 0px; margin-right: auto" border="0" alt="image" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/EF-6.1--Whats-new-1_9B2C/image_thumb_1.png" width="244" height="170" /></a></p> <p>Il testo di “Name” infuenzerà il nome della classe “DbContext” generata. Dalla scheramata successiva (“Entity Data Model Wizard”) scegliamo “Code First model from Database”:</p> <p><a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/EF-6.1--Whats-new-1_9B2C/image_6.png"><img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; float: none; padding-top: 0px; padding-left: 0px; margin-left: auto; border-left: 0px; display: block; padding-right: 0px; margin-right: auto" border="0" alt="image" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/EF-6.1--Whats-new-1_9B2C/image_thumb_2.png" width="244" height="170" /></a></p> <p>Nella schermata successiva del Wizard verrà chiesta la connessione dati da utilizzare (eventualmente ne creiamo una nuova), nel mio caso, per i test ho utilizzato un DB di un evento “DomusDotNet”. L’ultimo passo è la scelta degli oggetti da “importare”:</p> <p><a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/EF-6.1--Whats-new-1_9B2C/image_8.png"><img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; float: none; padding-top: 0px; padding-left: 0px; margin-left: auto; border-left: 0px; display: block; padding-right: 0px; margin-right: auto" border="0" alt="image" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/EF-6.1--Whats-new-1_9B2C/image_thumb_3.png" width="244" height="219" /></a></p> <p>Dopo aver premuto “Finish” e qualche secondo di pazienza, VS aggiungerà all’alberatura del progetto, tutte le classi necessarie, una “buildata” per verificare che sia tutto a posto , e qualche riga di codice per verificare l’estrapolazione dati :</p> <pre class="csharpcode"><span class="kwrd">using</span> (CarRental db = <span class="kwrd">new</span> CarRental()) { System.Console.WriteLine(<span class="str">"There are {0} cars."</span>, db.Cars.Count()); System.Console.ReadKey(); }</pre> <style type="text/css"><![CDATA[ .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }]]></style><img src="http://blogs.ugidotnet.org/PietroLibroBlog/aggbug/101823.aspx" width="1" height="1" /> Pietro Libro http://blogs.ugidotnet.org/PietroLibroBlog/archive/2014/03/20/ef-6.1-whatrsquos-new-1.aspx Thu, 20 Mar 2014 12:42:00 GMT http://blogs.ugidotnet.org/PietroLibroBlog/archive/2014/03/20/ef-6.1-whatrsquos-new-1.aspx#feedback http://blogs.ugidotnet.org/PietroLibroBlog/comments/commentRss/101823.aspx http://blogs.ugidotnet.org/PietroLibroBlog/services/trackbacks/101823.aspx Dynamic Data Provider per EF6 released .Net Framework 4.0 .Net Framework 4.5 Entity Framework 6 Visual Studio 2013 C# ASP.NET Code First Migrations Tools http://blogs.ugidotnet.org/PietroLibroBlog/archive/2014/03/03/dynamic-data-provider-per-ef6-released.aspx <p>Sono stati rilasciati in RTM, <em>ASP.NET Dynamic Data</em> e <em>EntityDataSource</em> per EntityFrameowrk 6. Per provare la nuova versione di <em>Dynamic Data</em> è sufficiente creare un nuovo progetto di tipo “ASP.NET Dynamic Data Entities Web Application”, ed installare tramite NuGet il package <em>Microsoft.AspNet.DynamicData.EFProvider</em>:</p> <p align="center"><a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/3b52774302cc_7140/image_2.png"><img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/3b52774302cc_7140/image_thumb.png" width="244" height="33" /></a></p> <p>Eventualmente forziamo la scrittura dei <em>Template</em> (“A” per sovrascrivere tutto):</p> <p><a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/3b52774302cc_7140/image_4.png"><img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; float: none; padding-top: 0px; padding-left: 0px; margin-left: auto; border-left: 0px; display: block; padding-right: 0px; margin-right: auto" border="0" alt="image" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/3b52774302cc_7140/image_thumb_1.png" width="244" height="39" /></a></p> <p>Aggiungiamo in modalità <em>Code First</em> una semplice classe <em>Book </em>e relativo <em>DbContext</em>:</p> <pre class="csharpcode"><span class="kwrd">public</span> <span class="kwrd">class</span> Book { <span class="kwrd">public</span> <span class="kwrd">int</span> Id { get; set; } <span class="kwrd">public</span> <span class="kwrd">string</span> Title { get; set; } <span class="kwrd">public</span> <span class="kwrd">string</span> Authors { get; set; } <span class="kwrd">public</span> <span class="kwrd">int</span> Pages { get; set; } } <span class="kwrd">public</span> <span class="kwrd">class</span> Db : DbContext { <span class="kwrd">public</span> DbSet&lt;Book&gt; Books { get; set; } <span class="kwrd">protected</span> <span class="kwrd">override</span> <span class="kwrd">void</span> OnModelCreating(DbModelBuilder modelBuilder) { <span class="kwrd">base</span>.OnModelCreating(modelBuilder); } }</pre> <style type="text/css"><![CDATA[ .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }]]></style> <p> </p> <p>Nel <em>Global.asax</em> registriamo il nostro <em>DbContext</em>:</p> <pre class="csharpcode">DefaultModel.RegisterContext( <span class="kwrd">new</span> Microsoft.AspNet.DynamicData.ModelProviders.EFDataModelProvider(() =&gt; <span class="kwrd">new</span> Db()), <span class="kwrd">new</span> ContextConfiguration { ScaffoldAllTables = <span class="kwrd">true</span> });</pre> <style type="text/css"><![CDATA[ .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }]]></style> <p> </p> <p>F5, per vedere in azione il nostro <em>Data Site</em>:</p> <p><a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/3b52774302cc_7140/image_6.png"><img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/3b52774302cc_7140/image_thumb_2.png" width="244" height="156" /></a></p> <p>Discorso simile per l’utilizzo <em>dell’EntityDataSource</em> control.</p><img src="http://blogs.ugidotnet.org/PietroLibroBlog/aggbug/101806.aspx" width="1" height="1" /> Pietro Libro http://blogs.ugidotnet.org/PietroLibroBlog/archive/2014/03/03/dynamic-data-provider-per-ef6-released.aspx Mon, 03 Mar 2014 10:06:00 GMT http://blogs.ugidotnet.org/PietroLibroBlog/archive/2014/03/03/dynamic-data-provider-per-ef6-released.aspx#feedback http://blogs.ugidotnet.org/PietroLibroBlog/comments/commentRss/101806.aspx http://blogs.ugidotnet.org/PietroLibroBlog/services/trackbacks/101806.aspx Windows Azure WebJobs (parte 4) .Net Framework 4.5 C# Visual Studio 2013 http://blogs.ugidotnet.org/PietroLibroBlog/archive/2014/02/17/windows-azure-webjobs-parte-4.aspx <p>Per automatizzare tramite script il processo di creazione di un WebJob utilizzando <a href="http://msdn.microsoft.com/en-us/library/windowsazure/jj156055.aspx" target="_blank">Windows Azure Power Shell</a> (Windows PowerShell ISE), i principali comandi da utilizzare sono:</p> <ul> <li><em>Add-AzureAccount</em>, che ci permette di autenticarci utilizzando <a href="http://www.windowsazure.com/en-us/services/active-directory/" target="_blank">Active Azure Directory</a> </li> <li><em>Get-AzureWebsite</em>, per avere una panoramica dei WebSites legati alla <em>subscription</em> con la quale siamo collegati </li> <li><em>Get-AzureWebsiteJob</em>, il quale ritorna le informazioni sul WebJob specificato dal paramentro <em>Name</em>  </li> </ul> <p align="center"><a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/Windows-Azure-WebJobs-parte-4_C607/image_4.png"><img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; padding-top: 0px; padding-left: 0px; display: inline; padding-right: 0px; border-top-width: 0px" border="0" alt="image" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/Windows-Azure-WebJobs-parte-4_C607/image_thumb_1.png" width="244" height="70" /></a></p> <ul> <li> <em>New-AzureWebsiteJob</em>, il quale permette la creazione di un nuovo WebJob ed accetta in ingresso i seguenti parametri: <ul> <li><em>Name</em>, il nome del WebSite di riferimento </li> <li><em>JobName</em>, il nome del WebJob </li> <li><em>JobType</em>, la modalità di esecuzione del WebJob come descritto nel <a href="http://blogs.ugidotnet.org/PietroLibroBlog/archive/2014/02/05/windows-azure-webjobs-parte-1.aspx" target="_blank">primo post</a> relativo a questa serie </li> <li><em>JobFile</em>, il percorso dell’archivio compresso contenente tutti i file necessari all’esecuzione del Job </li> </ul> </li> <li><em>Remove-AzureWebsiteJob</em>, il quale rimuove il WebJob specificato ed necessita dei parametri: <em>Name</em>, <em>JobName</em> e <em>JobType</em> </li> </ul> <p>Per eseguire “Start&amp;Stop” del WebJob, possiamo utilizzare i comandi:</p> <ul> <li><em>Start-AzureWebsiteJob</em>, con parametri <em>Name</em>, <em>JobName</em> e <em>JobType</em> </li> <li><em>Stop-AzureWebsiteJob</em>, con parametri <em>Name</em> e <em>JobName</em> </li> </ul> <p>Se i comandi sopracitati non dovessero essere presenti nel tool (I WebJob sono in <em>Preview</em>) è sufficiente aggiornare la documentazione della guida:</p> <p><a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/Windows-Azure-WebJobs-parte-4_C607/image_6.png"><img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; float: none; padding-top: 0px; padding-left: 0px; margin-left: auto; display: block; padding-right: 0px; border-top-width: 0px; margin-right: auto" border="0" alt="image" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/Windows-Azure-WebJobs-parte-4_C607/image_thumb_2.png" width="244" height="64" /></a></p><img src="http://blogs.ugidotnet.org/PietroLibroBlog/aggbug/101780.aspx" width="1" height="1" /> Pietro Libro http://blogs.ugidotnet.org/PietroLibroBlog/archive/2014/02/17/windows-azure-webjobs-parte-4.aspx Mon, 17 Feb 2014 10:02:00 GMT http://blogs.ugidotnet.org/PietroLibroBlog/archive/2014/02/17/windows-azure-webjobs-parte-4.aspx#feedback http://blogs.ugidotnet.org/PietroLibroBlog/comments/commentRss/101780.aspx http://blogs.ugidotnet.org/PietroLibroBlog/services/trackbacks/101780.aspx Windows Azure WebJobs (parte 3) .Net Framework 4.5 C# ASP.NET http://blogs.ugidotnet.org/PietroLibroBlog/archive/2014/02/11/windows-azure-webjobs-parte-3.aspx <p>Torniamo ancora sull’argomento “WebJobs” descrivendo brevemente le varie modalità di <em>Triggering</em>:</p> <ul> <li>Alla creazione di un nuovo <em>Blob</em> </li> <li>Alla ricezione di un nuovo <em>Queue Message</em> </li> <li>Esplicatamente tramite l’invocazione della funzione <em>Call</em> </li> </ul> <p>Nei post precedenti (<a href="http://blogs.ugidotnet.org/PietroLibroBlog/archive/2014/02/05/windows-azure-webjobs-parte-1.aspx" target="_blank">parte 1</a> e <a href="http://blogs.ugidotnet.org/PietroLibroBlog/archive/2014/02/06/windows-azure-webjobs-parte-2.aspx" target="_blank">parte 2</a>) abbiamo visto come attivare il <em>Trigger</em> del “WebJob” alla creazione di un nuovo <em>Blob</em> all’interno di un <em>container</em> specifico semplicemente utilizzando l’attributo <em>[BlobInput].</em> Con le stesse modalità é possibile eseguire il <em>Binding</em> di una funzione invocata dall’instanza di <em>JobHost</em> al ricevimento di un messaggio in un specifica coda (<em>Queue</em>) come da esempio:</p> <pre class="csharpcode"><span class="kwrd">public</span> <span class="kwrd">static</span> <span class="kwrd">void</span> ProcessBobByQueueMessage([QueueInput(<span class="str">@"inputqueue"</span>)] <span class="kwrd">string</span> message, [BlobOutput(<span class="str">@"outputcontainer/resized_image.png"</span>)] Stream outputStream) { <span class="kwrd">if</span> (!message.Equals(<span class="str">"go"</span>)) <span class="kwrd">return</span>; CloudStorageAccount storageAccount = CloudStorageAccount.Parse( System.Configuration.ConfigurationManager.ConnectionStrings[<span class="str">"AzureJobsData"</span>] .ConnectionString); CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient(); CloudBlobContainer container = blobClient.GetContainerReference(<span class="str">"inputcontainer"</span>); CloudBlob blob = container.GetBlobReference(<span class="str">"TestPicture"</span>); Stream inputStream = <span class="kwrd">new</span> MemoryStream(); blob.DownloadToStream(inputStream); ResizeImage(inputStream, outputStream); }</pre> <style type="text/css"><![CDATA[ .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }]]></style> <p> </p> <p>La funzione “ProcessBobByQueueMessage” é invocata al momento che un messaggio contenente il testo “go” arriva nella coda denominata “inputqueue”, come nei casi precedenti, creiamo un nuovo <em>Blob</em> nel <em>container</em> “outputcontainer” con il nome di “resized_image.png”. Da notare che nel codice utilizziamo le clasi del namespace<em> Microsoft.WindowsAzure.StorageClient </em>per lavorare con le classi che rappresentano lo <em>storage</em> di Windows Azure. Per testare il tutto é sufficiente caricare il <em>Job</em> sul nostro Web Site di test o premere F5 e lavoare “in locale”. Tramite l’Azure Storage Explorer possiamo creare un nuovo messaggio con la dicitura “go” come da figura:</p> <p><a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/Windows-Azure-WebJobs-parte-3_DAA1/image_2.png"><img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; float: none; padding-top: 0px; padding-left: 0px; margin-left: auto; display: block; padding-right: 0px; border-top-width: 0px; margin-right: auto" border="0" alt="image" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/Windows-Azure-WebJobs-parte-3_DAA1/image_thumb.png" width="244" height="176" /></a></p> <p>E nel <em>container</em> di output avremo:</p> <p><a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/Windows-Azure-WebJobs-parte-3_DAA1/image_4.png"><img title="image" style="border-left-width: 0px; border-right-width: 0px; background-image: none; border-bottom-width: 0px; float: none; padding-top: 0px; padding-left: 0px; margin-left: auto; display: block; padding-right: 0px; border-top-width: 0px; margin-right: auto" border="0" alt="image" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/Windows-Azure-WebJobs-parte-3_DAA1/image_thumb_1.png" width="244" height="141" /></a></p> <p>Dal codice si evince come il nome del <em>Blob</em> di ouput (e di input) sia fissato, ma per un’applicazione reale questo non é un comportamento desiderabile, cosi’, sarebbe auspicabile avere un comportamento piu’ dinamico utilizzando (ad esempio) una classe “Custom” serializzata in JSON, contenente la definizione dei file (<em>Blob</em>) di <em>Input</em> ed <em>Output</em> e passata come messaggio testo alla coda, tradotto in codice:</p> <pre class="csharpcode"> <span class="kwrd">public</span> <span class="kwrd">static</span> <span class="kwrd">void</span> ProcessBobByQueueCustomMessage([QueueInput(<span class="str">@"inputqueue"</span>)] ImageMessage message, [BlobOutput(<span class="str">@"outputcontainer/{OutputName}"</span>)] Stream outputStream) { CloudStorageAccount storageaccount = CloudStorageAccount.Parse( System.Configuration.ConfigurationManager.ConnectionStrings[<span class="str">"AzureJobsData"</span>] .ConnectionString); CloudBlobClient blobclient = storageaccount.CreateCloudBlobClient(); CloudBlobContainer container = blobclient.GetContainerReference(<span class="str">"inputcontainer"</span>); CloudBlob blob = container.GetBlobReference(message.InputName); Stream inputStream = <span class="kwrd">new</span> MemoryStream(); blob.DownloadToStream(inputStream); ResizeImage(inputStream, outputStream); }</pre> <p> </p> <p>Da notare l’utilizzo del <em>placeHolder </em>“{OutputName}” specificato nel percorso (<em>BlobPath</em>) ed accettato come argomento dall’attributo <em>BlobPath</em>, uguale alla proprietà omonima della classe <em>ImageMessage</em>, ed utilizzata per definire il nome del <em>Blob</em> di output in questo modo:</p> <pre class="csharpcode"><span class="kwrd">public</span> <span class="kwrd">class</span> ImageMessage { <span class="kwrd">public</span> <span class="kwrd">string</span> InputName { get; set; } <span class="kwrd">public</span> <span class="kwrd">string</span> OutputName { get; set; } }</pre> <style type="text/css"><![CDATA[ .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }]]></style> <p> </p> <p>Per un giro di test è sufficiente creare un nuovo messagio con il testo seguente:</p> <p><a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/Windows-Azure-WebJobs-parte-3_DAA1/image_6.png"><img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; float: none; padding-top: 0px; padding-left: 0px; margin-left: auto; border-left: 0px; display: block; padding-right: 0px; margin-right: auto" border="0" alt="image" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/Windows-Azure-WebJobs-parte-3_DAA1/image_thumb_2.png" width="244" height="122" /></a></p> <p>Ottenendo:</p> <p><a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/Windows-Azure-WebJobs-parte-3_DAA1/image_8.png"><img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; float: none; padding-top: 0px; padding-left: 0px; margin-left: auto; border-left: 0px; display: block; padding-right: 0px; margin-right: auto" border="0" alt="image" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/Windows-Azure-WebJobs-parte-3_DAA1/image_thumb_3.png" width="244" height="136" /></a></p> <p>Interessante è l’utilizzo dell’attributo [<em>NoAutomaticTrigger()</em>] che indica all’istanza di “JobHost” di non far scattare un particolare metodo (magari per evitare che il job venga attivato quando non tutte le condizioni necessiaro sono presenti). Questo attributo non va d’accordo con l’attributo <em>[QueueInput(…)]</em> in quanto a runtime solleva un’eccezione con il messaggio seguente: <em>“Can't have QueueInput and NoAutomaticTrigger on the same function.”.</em></p> <p>Per invocare programmaticamente una funzione è sufficiente utilizzare il metodo <em>Call()</em> della classe JobHost:</p> <pre class="csharpcode">host.Call(methodInfo);</pre> <style type="text/css"><![CDATA[ .csharpcode, .csharpcode pre { font-size: small; color: black; font-family: consolas, "Courier New", courier, monospace; background-color: #ffffff; /*white-space: pre;*/ } .csharpcode pre { margin: 0em; } .csharpcode .rem { color: #008000; } .csharpcode .kwrd { color: #0000ff; } .csharpcode .str { color: #006080; } .csharpcode .op { color: #0000c0; } .csharpcode .preproc { color: #cc6633; } .csharpcode .asp { background-color: #ffff00; } .csharpcode .html { color: #800000; } .csharpcode .attr { color: #ff0000; } .csharpcode .alt { background-color: #f4f4f4; width: 100%; margin: 0em; } .csharpcode .lnum { color: #606060; }]]></style> <p> </p> <p>Dove “methodInfo” puo’ essere facilmente calcolato tramite <em>Reflection</em>.</p><img src="http://blogs.ugidotnet.org/PietroLibroBlog/aggbug/101771.aspx" width="1" height="1" /> Pietro Libro http://blogs.ugidotnet.org/PietroLibroBlog/archive/2014/02/11/windows-azure-webjobs-parte-3.aspx Tue, 11 Feb 2014 12:27:00 GMT http://blogs.ugidotnet.org/PietroLibroBlog/archive/2014/02/11/windows-azure-webjobs-parte-3.aspx#feedback http://blogs.ugidotnet.org/PietroLibroBlog/comments/commentRss/101771.aspx http://blogs.ugidotnet.org/PietroLibroBlog/services/trackbacks/101771.aspx Windows Azure WebJobs (parte 2) .Net Framework 4.5 C# Visual Studio 2013 http://blogs.ugidotnet.org/PietroLibroBlog/archive/2014/02/06/windows-azure-webjobs-parte-2.aspx <p>Nella <a href="http://blogs.ugidotnet.org/PietroLibroBlog/archive/2014/02/05/windows-azure-webjobs-parte-1.aspx" target="_blank">prima parte</a> abbiamo visto come creare un’applicazione console ed utilizzarla per elaborare (ridimensionare) in modalità <em>Continuously</em> dei <em>Blob</em> contenenti immagini, caricati in un particolare <em>container</em> del nostro <em>storage</em>. L’applicazione non è stata fisicamente copiata su un Web Site di Azure, ma è stata eseguita “in locale” sfruttando gli <em>endpoint</em> allo <em>storage</em>. Per caricare il nostro processo su <em>Web Site</em> i passi da compiere sono pochi e semplici:</p> <ul> <li>Accedere al portale di Windows Azure (<a title="https://manage.windowsazure.com" href="https://manage.windowsazure.com">https://manage.windowsazure.com</a>)</li> <li>Se non presente, creare un nuovo Web Site:</li> </ul> <p><a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/Windows-Azure-WebJobs-parte-2_7AF8/image_4.png"><img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; float: none; padding-top: 0px; padding-left: 0px; margin-left: auto; border-left: 0px; display: block; padding-right: 0px; margin-right: auto" border="0" alt="image" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/Windows-Azure-WebJobs-parte-2_7AF8/image_thumb_1.png" width="244" height="108" /></a></p> <ul> <li>Aprire il <em>Web Site</em> e visualizzare la sezione “Configure”:</li> </ul> <p><a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/Windows-Azure-WebJobs-parte-2_7AF8/image_10.png"><img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; float: none; padding-top: 0px; padding-left: 0px; margin-left: auto; border-left: 0px; display: block; padding-right: 0px; margin-right: auto" border="0" alt="image" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/Windows-Azure-WebJobs-parte-2_7AF8/image_thumb_4.png" width="244" height="23" /></a></p> <ul> <li>Nella sottosezione “connection strings”, aggiungiamo la stringa di connessione “AzureJobsRuntime”:</li> </ul> <p><a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/Windows-Azure-WebJobs-parte-2_7AF8/image_12.png"><img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; float: none; padding-top: 0px; padding-left: 0px; margin-left: auto; border-left: 0px; display: block; padding-right: 0px; margin-right: auto" border="0" alt="image" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/Windows-Azure-WebJobs-parte-2_7AF8/image_thumb_5.png" width="244" height="45" /></a></p> <ul> <li>Visualizziamo la sezione “WebJobs”:</li> </ul> <p><a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/Windows-Azure-WebJobs-parte-2_7AF8/image_8.png"><img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; float: none; padding-top: 0px; padding-left: 0px; margin-left: auto; border-left: 0px; display: block; padding-right: 0px; margin-right: auto" border="0" alt="image" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/Windows-Azure-WebJobs-parte-2_7AF8/image_thumb_3.png" width="244" height="52" /></a></p> <ul> <li> <p>Prima di effettuare l’upload dell’eseguibile è necessario creare una cartella compressa contenente sia “.exe” che “.dll” necessari al corretto funzionamento dell’applicazione. E’ sufficiente creare un archivio “zip” partendo (ad esempio) dalla cartella Debug\Release del nostro progetto. A questo punto è sufficiente cliccare sul bottone “ADD”, assegnare un nome al nostro “WebJob”, specificare il percorso della cartella compressa ed infine la modalità di esecuzione:</p> </li> </ul> <p><a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/Windows-Azure-WebJobs-parte-2_7AF8/image_14.png"><img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; float: none; padding-top: 0px; padding-left: 0px; margin-left: auto; border-left: 0px; display: block; padding-right: 0px; margin-right: auto" border="0" alt="image" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/Windows-Azure-WebJobs-parte-2_7AF8/image_thumb_6.png" width="233" height="244" /></a></p> <ul> <li> <p>Una volta caricato il file compresso, dovremmo avere una situazione simile alla seguente:</p> </li> </ul> <p align="center"><a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/Windows-Azure-WebJobs-parte-2_7AF8/image_16.png"><img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; padding-top: 0px; padding-left: 0px; margin: 0px; border-left: 0px; display: inline; padding-right: 0px" border="0" alt="image" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/Windows-Azure-WebJobs-parte-2_7AF8/image_thumb_7.png" width="244" height="43" /></a></p> <ul> <li> <p>Il <em>Job</em> caricato è in stato “STOP”, per entrare in “RUNNING” è ncessario cliccare l’icona con la dicitura “START” in fondo alla pagina:</p> </li> </ul> <p><a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/Windows-Azure-WebJobs-parte-2_7AF8/image_18.png"><img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; float: none; padding-top: 0px; padding-left: 0px; margin-left: auto; border-left: 0px; display: block; padding-right: 0px; margin-right: auto" border="0" alt="image" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/Windows-Azure-WebJobs-parte-2_7AF8/image_thumb_8.png" width="244" height="31" /></a></p> <ul> <li> <p>Per testare che tutto funzioni correttamente è sufficiente utilizzare il tool <a href="http://azurestorageexplorer.codeplex.com/" target="_blank">Azure Storage Explorer</a> come visto nella prima parte.</p> </li> </ul> <p>Se avessimo optato per un’esecuzione <em>On Demand</em> del <em>Job</em> ci saremmo trovati in una situazione di questo tipo:</p> <p><a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/Windows-Azure-WebJobs-parte-2_7AF8/image_20.png"><img title="image" style="border-top: 0px; border-right: 0px; background-image: none; border-bottom: 0px; float: none; padding-top: 0px; padding-left: 0px; margin-left: auto; border-left: 0px; display: block; padding-right: 0px; margin-right: auto" border="0" alt="image" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/Windows-Azure-WebJobs-parte-2_7AF8/image_thumb_9.png" width="244" height="194" /></a></p> <p>Dove per eseguire il processo si rende necessario cliccare l’icona con la dicitura “RUN ONCE”. Se si vuole invece provare la versione <em>Scheduled</em> è necessario attivare il servizio “Windows Azure Scheduler” tra quelli presenti in questa pagina: <a title="https://account.windowsazure.com/PreviewFeatures" href="https://account.windowsazure.com/PreviewFeatures" target="_blank">https://account.windowsazure.com/PreviewFeatures</a></p><img src="http://blogs.ugidotnet.org/PietroLibroBlog/aggbug/101766.aspx" width="1" height="1" /> Pietro Libro http://blogs.ugidotnet.org/PietroLibroBlog/archive/2014/02/06/windows-azure-webjobs-parte-2.aspx Thu, 06 Feb 2014 12:22:00 GMT http://blogs.ugidotnet.org/PietroLibroBlog/archive/2014/02/06/windows-azure-webjobs-parte-2.aspx#feedback http://blogs.ugidotnet.org/PietroLibroBlog/comments/commentRss/101766.aspx http://blogs.ugidotnet.org/PietroLibroBlog/services/trackbacks/101766.aspx