MVC 6 http://blogs.ugidotnet.org/PietroLibroBlog/category/MVC 6.aspx MVC 6 it-IT Pietro Libro pietro.libro@libero.it Subtext Version 2.6.0.0 Asp.Net 5, MVC 6 e Web Api 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