<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:copyright="http://blogs.law.harvard.edu/tech/rss" xmlns:image="http://purl.org/rss/1.0/modules/image/">
    <channel>
        <title>Visual Studio 2013</title>
        <link>http://blogs.ugidotnet.org/PietroLibroBlog/category/Visual Studio 2013.aspx</link>
        <description>Visual Studio 2013</description>
        <language>it-IT</language>
        <copyright>Pietro Libro</copyright>
        <managingEditor>pietro.libro@libero.it</managingEditor>
        <generator>Subtext Version 2.6.0.0</generator>
        <item>
            <title>EF 6.1 : What&amp;rsquo;s new (3)</title>
            <link>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2014/03/27/ef-6.1-whatrsquos-new-3.aspx</link>
            <description>&lt;p&gt;Supporto a “.ToString()” e “String.Concat()”, un esempio:&lt;/p&gt;  &lt;pre class="csharpcode"&gt;var queryConcat = from c &lt;span class="kwrd"&gt;in&lt;/span&gt; db.Vehicles
            &lt;span class="kwrd"&gt;where&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt;.Concat(c.EngineSize, c.HP).Equals(&lt;span class="str"&gt;"1600110"&lt;/span&gt;)
            select c;

var queryToString = from c &lt;span class="kwrd"&gt;in&lt;/span&gt; db.Vehicles
            &lt;span class="kwrd"&gt;where&lt;/span&gt;  c.HP.ToString().Equals(&lt;span class="str"&gt;"110"&lt;/span&gt;)
            select c;&lt;/pre&gt;
&lt;style type="text/css"&gt;&lt;![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; }]]&gt;&lt;/style&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;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:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/EF-6.1--Whats-new-3_7B13/image_2.png"&gt;&lt;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" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Con EF 6.1 le query sono eseguite correttamente:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/EF-6.1--Whats-new-3_7B13/image_4.png"&gt;&lt;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" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Cosa succede dietro le quinte:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;SELECT&lt;/span&gt; 
    [GroupBy1].[A1] &lt;span class="kwrd"&gt;AS&lt;/span&gt; [C1]
    &lt;span class="kwrd"&gt;FROM&lt;/span&gt; ( &lt;span class="kwrd"&gt;SELECT&lt;/span&gt; 
        &lt;span class="kwrd"&gt;COUNT&lt;/span&gt;(1) &lt;span class="kwrd"&gt;AS&lt;/span&gt; [A1]
        &lt;span class="kwrd"&gt;FROM&lt;/span&gt; [DomusDotNet].[Vehicles] &lt;span class="kwrd"&gt;AS&lt;/span&gt; [Extent1]
        &lt;span class="kwrd"&gt;WHERE&lt;/span&gt; N&lt;span class="str"&gt;'1600110'&lt;/span&gt; = (&lt;span class="kwrd"&gt;CASE&lt;/span&gt; &lt;span class="kwrd"&gt;WHEN&lt;/span&gt; ([Extent1].[EngineSize] &lt;span class="kwrd"&gt;IS&lt;/span&gt; &lt;span class="kwrd"&gt;NULL&lt;/span&gt;) &lt;span class="kwrd"&gt;THEN&lt;/span&gt; N&lt;span class="str"&gt;''&lt;/span&gt; &lt;span class="kwrd"&gt;ELSE&lt;/span&gt; [Extent1].[EngineSize] &lt;span class="kwrd"&gt;END&lt;/span&gt; +  &lt;span class="kwrd"&gt;CAST&lt;/span&gt;( [Extent1].[HP] &lt;span class="kwrd"&gt;AS&lt;/span&gt; nvarchar(&lt;span class="kwrd"&gt;max&lt;/span&gt;)))
    )  &lt;span class="kwrd"&gt;AS&lt;/span&gt; [GroupBy1]

&lt;span class="kwrd"&gt;SELECT&lt;/span&gt; 
    [GroupBy1].[A1] &lt;span class="kwrd"&gt;AS&lt;/span&gt; [C1]
    &lt;span class="kwrd"&gt;FROM&lt;/span&gt; ( &lt;span class="kwrd"&gt;SELECT&lt;/span&gt; 
        &lt;span class="kwrd"&gt;COUNT&lt;/span&gt;(1) &lt;span class="kwrd"&gt;AS&lt;/span&gt; [A1]
        &lt;span class="kwrd"&gt;FROM&lt;/span&gt; [DomusDotNet].[Vehicles] &lt;span class="kwrd"&gt;AS&lt;/span&gt; [Extent1]
        &lt;span class="kwrd"&gt;WHERE&lt;/span&gt; N&lt;span class="str"&gt;'110'&lt;/span&gt; =  &lt;span class="kwrd"&gt;CAST&lt;/span&gt;( [Extent1].[HP] &lt;span class="kwrd"&gt;AS&lt;/span&gt; nvarchar(&lt;span class="kwrd"&gt;max&lt;/span&gt;))
    )  &lt;span class="kwrd"&gt;AS&lt;/span&gt; [GroupBy1]&lt;/pre&gt;
&lt;style type="text/css"&gt;&lt;![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; }]]&gt;&lt;/style&gt;



&lt;p&gt;Da analizzare il funzionamento di “String.Concat(…)” con SQL Server 2012 per verificare la conversione in SQL con la funzione “nativa SQL” “&lt;a href="http://technet.microsoft.com/en-us/library/hh231515.aspx" target="_blank"&gt;Concat&lt;/a&gt;”.&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/PietroLibroBlog/aggbug/101829.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Pietro Libro</dc:creator>
            <guid>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2014/03/27/ef-6.1-whatrsquos-new-3.aspx</guid>
            <pubDate>Thu, 27 Mar 2014 10:04:00 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2014/03/27/ef-6.1-whatrsquos-new-3.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/PietroLibroBlog/comments/commentRss/101829.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/PietroLibroBlog/services/trackbacks/101829.aspx</trackback:ping>
        </item>
        <item>
            <title>EF 6.1 : What&amp;rsquo;s new (2)</title>
            <link>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2014/03/20/ef-6.1-whatrsquos-new-2.aspx</link>
            <description>&lt;p&gt;Altra &lt;em&gt;feature &lt;/em&gt;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:&lt;/p&gt;  &lt;pre class="csharpcode"&gt;[Index(&lt;span class="str"&gt;"IX_FreeDailyKm_Clustered"&lt;/span&gt;, IsUnique = &lt;span class="kwrd"&gt;false&lt;/span&gt;, IsClustered = &lt;span class="kwrd"&gt;false&lt;/span&gt;)]
&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; FreeDailyKm { get; set; }&lt;/pre&gt;
&lt;style type="text/css"&gt;&lt;![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; }]]&gt;&lt;/style&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;Mentre per creare un indice che insiste su due proprietà, è sufficiente utilizzare lo stesso nome come da esempio:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;[Index(&lt;span class="str"&gt;"IX_Engine"&lt;/span&gt;, 2)]
&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; EngineSize { get; set; }

[Index(&lt;span class="str"&gt;"IX_Engine"&lt;/span&gt;, 1)]
&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; HP { get; set; }&lt;/pre&gt;
&lt;style type="text/css"&gt;&lt;![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; }]]&gt;&lt;/style&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;Utilizzando &lt;em&gt;EF migrations&lt;/em&gt; per aggiornare il database, avremmo:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;CreateIndex(&lt;span class="str"&gt;"DomusDotNet.Vehicles"&lt;/span&gt;, &lt;span class="str"&gt;"FreeDailyKm"&lt;/span&gt;, name: &lt;span class="str"&gt;"IX_FreeDailyKm_Clustered"&lt;/span&gt;);
CreateIndex(&lt;span class="str"&gt;"DomusDotNet.Vehicles"&lt;/span&gt;, &lt;span class="kwrd"&gt;new&lt;/span&gt;[] { &lt;span class="str"&gt;"HP"&lt;/span&gt;, &lt;span class="str"&gt;"EngineSize"&lt;/span&gt; }, name: &lt;span class="str"&gt;"IX_Engine"&lt;/span&gt;);&lt;/pre&gt;
&lt;style type="text/css"&gt;&lt;![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; }]]&gt;&lt;/style&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;Quindi, a livello di database:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/EF-6.1--Whats-new-2_EA92/image_2.png"&gt;&lt;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" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/PietroLibroBlog/aggbug/101825.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Pietro Libro</dc:creator>
            <guid>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2014/03/20/ef-6.1-whatrsquos-new-2.aspx</guid>
            <pubDate>Thu, 20 Mar 2014 17:49:00 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2014/03/20/ef-6.1-whatrsquos-new-2.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/PietroLibroBlog/comments/commentRss/101825.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/PietroLibroBlog/services/trackbacks/101825.aspx</trackback:ping>
        </item>
        <item>
            <title>EF 6.1 : What&amp;rsquo;s new (1)</title>
            <link>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2014/03/20/ef-6.1-whatrsquos-new-1.aspx</link>
            <description>&lt;p&gt;Da qualche giorno è stata rilasciata in RTM la &lt;a href="http://blogs.msdn.com/b/adonet/archive/2014/03/17/ef6-1-0-rtm-available.aspx" target="_blank"&gt;versione 6.1.0&lt;/a&gt; di Entity Framework. Una delle novità piu’ interessanti è sicuramente la possibilità di utilizzare l’approcio  &lt;em&gt;Code First &lt;/em&gt;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 &lt;a href="http://www.microsoft.com/en-us/download/details.aspx?id=40762" target="_blank"&gt;questo&lt;/a&gt; link.&lt;/p&gt;  &lt;p&gt;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”:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/EF-6.1--Whats-new-1_9B2C/image_4.png"&gt;&lt;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" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Il testo di “Name” infuenzerà il nome della classe “DbContext” generata. Dalla scheramata successiva (“Entity Data Model Wizard”) scegliamo “Code First model from Database”:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/EF-6.1--Whats-new-1_9B2C/image_6.png"&gt;&lt;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" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;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”:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/EF-6.1--Whats-new-1_9B2C/image_8.png"&gt;&lt;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" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;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 :&lt;/p&gt;  &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;using&lt;/span&gt; (CarRental db = &lt;span class="kwrd"&gt;new&lt;/span&gt; CarRental())
{
    System.Console.WriteLine(&lt;span class="str"&gt;"There are {0} cars."&lt;/span&gt;, db.Cars.Count());
    System.Console.ReadKey();
}&lt;/pre&gt;
&lt;style type="text/css"&gt;&lt;![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; }]]&gt;&lt;/style&gt;&lt;img src="http://blogs.ugidotnet.org/PietroLibroBlog/aggbug/101823.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Pietro Libro</dc:creator>
            <guid>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2014/03/20/ef-6.1-whatrsquos-new-1.aspx</guid>
            <pubDate>Thu, 20 Mar 2014 12:42:00 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2014/03/20/ef-6.1-whatrsquos-new-1.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/PietroLibroBlog/comments/commentRss/101823.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/PietroLibroBlog/services/trackbacks/101823.aspx</trackback:ping>
        </item>
        <item>
            <title>Dynamic Data Provider per EF6 released</title>
            <link>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2014/03/03/dynamic-data-provider-per-ef6-released.aspx</link>
            <description>&lt;p&gt;Sono stati rilasciati in RTM, &lt;em&gt;ASP.NET Dynamic Data&lt;/em&gt; e &lt;em&gt;EntityDataSource&lt;/em&gt; per EntityFrameowrk 6. Per provare la nuova versione di &lt;em&gt;Dynamic Data&lt;/em&gt; è sufficiente creare un nuovo progetto di tipo “ASP.NET Dynamic Data Entities Web Application”, ed installare tramite NuGet il package &lt;em&gt;Microsoft.AspNet.DynamicData.EFProvider&lt;/em&gt;:&lt;/p&gt;  &lt;p align="center"&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/3b52774302cc_7140/image_2.png"&gt;&lt;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" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Eventualmente forziamo la scrittura dei &lt;em&gt;Template&lt;/em&gt; (“A” per sovrascrivere tutto):&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/3b52774302cc_7140/image_4.png"&gt;&lt;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" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Aggiungiamo in modalità &lt;em&gt;Code First&lt;/em&gt; una semplice classe &lt;em&gt;Book &lt;/em&gt;e relativo &lt;em&gt;DbContext&lt;/em&gt;:&lt;/p&gt;  &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; Book
{
    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; Id { get; set; }
    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; Title { get; set; }
    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; Authors { get; set; }
    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;int&lt;/span&gt; Pages { get; set; }
}

&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;class&lt;/span&gt; Db : DbContext
{
    &lt;span class="kwrd"&gt;public&lt;/span&gt; DbSet&amp;lt;Book&amp;gt; Books { get; set; }

    &lt;span class="kwrd"&gt;protected&lt;/span&gt; &lt;span class="kwrd"&gt;override&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; OnModelCreating(DbModelBuilder modelBuilder)
    {
        &lt;span class="kwrd"&gt;base&lt;/span&gt;.OnModelCreating(modelBuilder);
    }
}&lt;/pre&gt;
&lt;style type="text/css"&gt;&lt;![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; }]]&gt;&lt;/style&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;Nel &lt;em&gt;Global.asax&lt;/em&gt; registriamo il nostro &lt;em&gt;DbContext&lt;/em&gt;:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;DefaultModel.RegisterContext(
            &lt;span class="kwrd"&gt;new&lt;/span&gt; Microsoft.AspNet.DynamicData.ModelProviders.EFDataModelProvider(() =&amp;gt; &lt;span class="kwrd"&gt;new&lt;/span&gt; Db()),
            &lt;span class="kwrd"&gt;new&lt;/span&gt; ContextConfiguration { ScaffoldAllTables = &lt;span class="kwrd"&gt;true&lt;/span&gt; });&lt;/pre&gt;
&lt;style type="text/css"&gt;&lt;![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; }]]&gt;&lt;/style&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;F5, per vedere in azione il nostro &lt;em&gt;Data Site&lt;/em&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/3b52774302cc_7140/image_6.png"&gt;&lt;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" /&gt;&lt;/a&gt;&lt;/p&gt;





&lt;p&gt;Discorso simile per l’utilizzo &lt;em&gt;dell’EntityDataSource&lt;/em&gt; control.&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/PietroLibroBlog/aggbug/101806.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Pietro Libro</dc:creator>
            <guid>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2014/03/03/dynamic-data-provider-per-ef6-released.aspx</guid>
            <pubDate>Mon, 03 Mar 2014 10:06:00 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2014/03/03/dynamic-data-provider-per-ef6-released.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/PietroLibroBlog/comments/commentRss/101806.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/PietroLibroBlog/services/trackbacks/101806.aspx</trackback:ping>
        </item>
        <item>
            <title>Windows Azure WebJobs (parte 4)</title>
            <link>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2014/02/17/windows-azure-webjobs-parte-4.aspx</link>
            <description>&lt;p&gt;Per automatizzare tramite script il processo di creazione di un WebJob utilizzando &lt;a href="http://msdn.microsoft.com/en-us/library/windowsazure/jj156055.aspx" target="_blank"&gt;Windows Azure Power Shell&lt;/a&gt; (Windows PowerShell ISE), i principali comandi da utilizzare sono:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;em&gt;Add-AzureAccount&lt;/em&gt;, che ci permette di autenticarci utilizzando &lt;a href="http://www.windowsazure.com/en-us/services/active-directory/" target="_blank"&gt;Active Azure Directory&lt;/a&gt; &lt;/li&gt;    &lt;li&gt;&lt;em&gt;Get-AzureWebsite&lt;/em&gt;, per avere una panoramica dei WebSites legati alla &lt;em&gt;subscription&lt;/em&gt; con la quale siamo collegati &lt;/li&gt;    &lt;li&gt;&lt;em&gt;Get-AzureWebsiteJob&lt;/em&gt;, il quale ritorna le informazioni sul WebJob specificato dal paramentro &lt;em&gt;Name&lt;/em&gt;  &lt;/li&gt; &lt;/ul&gt;  &lt;p align="center"&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/Windows-Azure-WebJobs-parte-4_C607/image_4.png"&gt;&lt;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" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt; &lt;em&gt;New-AzureWebsiteJob&lt;/em&gt;, il quale permette la creazione di un nuovo WebJob ed accetta in ingresso i seguenti parametri:       &lt;ul&gt;       &lt;li&gt;&lt;em&gt;Name&lt;/em&gt;, il nome del WebSite di riferimento &lt;/li&gt;        &lt;li&gt;&lt;em&gt;JobName&lt;/em&gt;, il nome del WebJob &lt;/li&gt;        &lt;li&gt;&lt;em&gt;JobType&lt;/em&gt;, la modalità di esecuzione del WebJob come descritto nel &lt;a href="http://blogs.ugidotnet.org/PietroLibroBlog/archive/2014/02/05/windows-azure-webjobs-parte-1.aspx" target="_blank"&gt;primo post&lt;/a&gt; relativo a questa serie &lt;/li&gt;        &lt;li&gt;&lt;em&gt;JobFile&lt;/em&gt;, il percorso dell’archivio compresso contenente tutti i file necessari all’esecuzione del Job &lt;/li&gt;     &lt;/ul&gt;   &lt;/li&gt;    &lt;li&gt;&lt;em&gt;Remove-AzureWebsiteJob&lt;/em&gt;, il quale rimuove il WebJob specificato ed necessita dei parametri: &lt;em&gt;Name&lt;/em&gt;, &lt;em&gt;JobName&lt;/em&gt; e &lt;em&gt;JobType&lt;/em&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Per eseguire “Start&amp;amp;Stop” del WebJob, possiamo utilizzare i comandi:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;&lt;em&gt;Start-AzureWebsiteJob&lt;/em&gt;, con parametri &lt;em&gt;Name&lt;/em&gt;, &lt;em&gt;JobName&lt;/em&gt; e &lt;em&gt;JobType&lt;/em&gt; &lt;/li&gt;    &lt;li&gt;&lt;em&gt;Stop-AzureWebsiteJob&lt;/em&gt;, con parametri &lt;em&gt;Name&lt;/em&gt; e &lt;em&gt;JobName&lt;/em&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Se i comandi sopracitati non dovessero essere presenti nel tool (I WebJob sono in &lt;em&gt;Preview&lt;/em&gt;) è sufficiente aggiornare la documentazione della guida:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/Windows-Azure-WebJobs-parte-4_C607/image_6.png"&gt;&lt;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" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/PietroLibroBlog/aggbug/101780.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Pietro Libro</dc:creator>
            <guid>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2014/02/17/windows-azure-webjobs-parte-4.aspx</guid>
            <pubDate>Mon, 17 Feb 2014 10:02:00 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2014/02/17/windows-azure-webjobs-parte-4.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/PietroLibroBlog/comments/commentRss/101780.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/PietroLibroBlog/services/trackbacks/101780.aspx</trackback:ping>
        </item>
        <item>
            <title>Windows Azure WebJobs (parte 2)</title>
            <link>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2014/02/06/windows-azure-webjobs-parte-2.aspx</link>
            <description>&lt;p&gt;Nella &lt;a href="http://blogs.ugidotnet.org/PietroLibroBlog/archive/2014/02/05/windows-azure-webjobs-parte-1.aspx" target="_blank"&gt;prima parte&lt;/a&gt; abbiamo visto come creare un’applicazione console ed utilizzarla per elaborare (ridimensionare) in modalità &lt;em&gt;Continuously&lt;/em&gt; dei &lt;em&gt;Blob&lt;/em&gt; contenenti immagini, caricati in un particolare &lt;em&gt;container&lt;/em&gt; del nostro &lt;em&gt;storage&lt;/em&gt;. L’applicazione non è stata fisicamente copiata su un Web Site di Azure, ma è stata eseguita “in locale” sfruttando gli &lt;em&gt;endpoint&lt;/em&gt; allo &lt;em&gt;storage&lt;/em&gt;. Per caricare il nostro processo su &lt;em&gt;Web Site&lt;/em&gt; i passi da compiere sono pochi e semplici:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Accedere al portale di Windows Azure (&lt;a title="https://manage.windowsazure.com" href="https://manage.windowsazure.com"&gt;https://manage.windowsazure.com&lt;/a&gt;)&lt;/li&gt;    &lt;li&gt;Se non presente, creare un nuovo Web Site:&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/Windows-Azure-WebJobs-parte-2_7AF8/image_4.png"&gt;&lt;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" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Aprire il &lt;em&gt;Web Site&lt;/em&gt; e visualizzare la sezione “Configure”:&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/Windows-Azure-WebJobs-parte-2_7AF8/image_10.png"&gt;&lt;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" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Nella sottosezione “connection strings”, aggiungiamo la stringa di connessione “AzureJobsRuntime”:&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/Windows-Azure-WebJobs-parte-2_7AF8/image_12.png"&gt;&lt;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" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Visualizziamo la sezione “WebJobs”:&lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/Windows-Azure-WebJobs-parte-2_7AF8/image_8.png"&gt;&lt;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" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;                 &lt;p&gt;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:&lt;/p&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/Windows-Azure-WebJobs-parte-2_7AF8/image_14.png"&gt;&lt;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" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;     &lt;p&gt;Una volta caricato il file compresso, dovremmo avere una situazione simile alla seguente:&lt;/p&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p align="center"&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/Windows-Azure-WebJobs-parte-2_7AF8/image_16.png"&gt;&lt;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" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;     &lt;p&gt;Il &lt;em&gt;Job&lt;/em&gt; caricato è in stato “STOP”, per entrare in “RUNNING” è ncessario cliccare l’icona con la dicitura “START” in fondo alla pagina:&lt;/p&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/Windows-Azure-WebJobs-parte-2_7AF8/image_18.png"&gt;&lt;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" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;     &lt;p&gt;Per testare che tutto funzioni correttamente è sufficiente utilizzare il tool &lt;a href="http://azurestorageexplorer.codeplex.com/" target="_blank"&gt;Azure Storage Explorer&lt;/a&gt; come visto nella prima parte.&lt;/p&gt;   &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Se avessimo optato per un’esecuzione &lt;em&gt;On Demand&lt;/em&gt; del &lt;em&gt;Job&lt;/em&gt; ci saremmo trovati in una situazione di questo tipo:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/Windows-Azure-WebJobs-parte-2_7AF8/image_20.png"&gt;&lt;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" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Dove per eseguire il processo si rende necessario cliccare l’icona con la dicitura “RUN ONCE”. Se si vuole invece provare la versione &lt;em&gt;Scheduled&lt;/em&gt; è necessario attivare il servizio “Windows Azure Scheduler” tra quelli presenti in questa pagina: &lt;a title="https://account.windowsazure.com/PreviewFeatures" href="https://account.windowsazure.com/PreviewFeatures" target="_blank"&gt;https://account.windowsazure.com/PreviewFeatures&lt;/a&gt;&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/PietroLibroBlog/aggbug/101766.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Pietro Libro</dc:creator>
            <guid>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2014/02/06/windows-azure-webjobs-parte-2.aspx</guid>
            <pubDate>Thu, 06 Feb 2014 12:22:00 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2014/02/06/windows-azure-webjobs-parte-2.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/PietroLibroBlog/comments/commentRss/101766.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/PietroLibroBlog/services/trackbacks/101766.aspx</trackback:ping>
        </item>
        <item>
            <title>Windows Azure WebJobs (parte 1)</title>
            <link>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2014/02/05/windows-azure-webjobs-parte-1.aspx</link>
            <description>&lt;p&gt;Windows Azure mi appassiona veramente tanto e le nuove funzionalità  rilasciate (seppur in &lt;em&gt;alpha&lt;/em&gt;) aumentano ancora di piu’  la voglia e volontà di adottare questa piattaforma. E’ il caso dei &lt;em&gt;WebJobs&lt;/em&gt;, un nuovo SDK in versione &lt;em&gt;alpha&lt;/em&gt; che permette di eseguire programmi e script ospitati nei &lt;em&gt;Web Site&lt;/em&gt; di Windows Azure, “semplicemente” tramite upload di un file (ad esempio “.exe” o “.cmd” ) dato che tutto il “difficile” è onere del “WebJobs SDK”.&lt;/p&gt;  &lt;p&gt;Questa nuova &lt;em&gt;feature &lt;/em&gt;permette di eseguire dei veri e propri &lt;em&gt;batch,&lt;/em&gt; processi che normalmente impiegherebbero molto tempo per essere eseguiti, come ad esempio la riorganizzazione di file, invio di email, processamento di immagini o code (&lt;em&gt;Queue&lt;/em&gt;). Un &lt;em&gt;batch &lt;/em&gt;puo’ essere eseguito in tre modalità differenti:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;On-Demand (&lt;em&gt;a richiesta&lt;/em&gt;) &lt;/li&gt;    &lt;li&gt;Continuously, il processo in background è sempre attivo “in attesa di fare qualcosa”, il &lt;em&gt;Trigger&lt;/em&gt; per attivare il processo puo’ essere ad esempio la ricezione di un messaggio in una specifica coda oppure la creazione di un nuovo &lt;em&gt;Blob&lt;/em&gt; &lt;/li&gt;    &lt;li&gt;Scheduled, vogliamo che il nostro processo esegua del lavoro ad una certa ora di uno o piu’ giorni della settimana (in modalità singola o ricorrente) &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Un piccolo scenario d’esempio: un task (sempre attivo) che &lt;em&gt;triggerato&lt;/em&gt; al caricamento di un &lt;em&gt;Blob&lt;/em&gt; (un file immagine) in uno specifico &lt;em&gt;container &lt;/em&gt;(“inputcontainer”), lo elabora (ridimensiona l’immagine e ne cambia formato in “png”) e salva il &lt;em&gt;Blob&lt;/em&gt; risultato in un altro &lt;em&gt;container&lt;/em&gt; (“outputcontainer”).&lt;/p&gt;  &lt;p&gt;Per iniziare è sufficiente creare una nuova applicazione console C# ed aggiungere i &lt;em&gt;package&lt;/em&gt; necessari traminte NuGet:&lt;/p&gt;  &lt;p&gt;PM&amp;gt; Install-Package Microsoft.WindowsAzure.Jobs.Host –pre&lt;/p&gt;  &lt;p&gt;In &lt;em&gt;Program.cs&lt;/em&gt; scriviamo il codice seguente:&lt;/p&gt;  &lt;pre class="csharpcode"&gt;&lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; Main(&lt;span class="kwrd"&gt;string&lt;/span&gt;[] args)
{
    JobHost host = &lt;span class="kwrd"&gt;new&lt;/span&gt; JobHost();
    host.RunAndBlock();
}

&lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;static&lt;/span&gt; &lt;span class="kwrd"&gt;void&lt;/span&gt; ProcessJob([BlobInput(&lt;span class="str"&gt;@"inputcontainer/{name}"&lt;/span&gt;)] Stream inputStream,
    [BlobOutput(&lt;span class="str"&gt;@"outputcontainer/{name}"&lt;/span&gt;)]  Stream outputStream)
{
    &lt;span class="kwrd"&gt;using&lt;/span&gt; (Bitmap inputImage = &lt;span class="kwrd"&gt;new&lt;/span&gt; Bitmap(inputStream))
    {
        Image outputImage = &lt;span class="kwrd"&gt;new&lt;/span&gt; Bitmap(200, 200);

        &lt;span class="kwrd"&gt;using&lt;/span&gt; (Graphics g = Graphics.FromImage(outputImage))
        {

            g.InterpolationMode = InterpolationMode.HighQualityBicubic;
            g.CompositingMode = CompositingMode.SourceCopy;
            g.PixelOffsetMode = PixelOffsetMode.HighQuality;

            &lt;span class="kwrd"&gt;using&lt;/span&gt; (ImageAttributes imageAttributes = &lt;span class="kwrd"&gt;new&lt;/span&gt; ImageAttributes())
            {
                Rectangle destRect = &lt;span class="kwrd"&gt;new&lt;/span&gt; Rectangle(0, 0, 200, 200);
                g.DrawImage(inputImage, destRect, 0, 0, inputImage.Width, inputImage.Height, GraphicsUnit.Pixel, imageAttributes);
            }
        }

        System.Drawing.Imaging.ImageFormat pngFormat = &lt;span class="kwrd"&gt;new&lt;/span&gt; System.Drawing.Imaging.ImageFormat(ImageFormat.Png.Guid);
        outputImage.Save(outputStream, pngFormat);
    }
}&lt;/pre&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;E’ abbastanza intuitivo che il “lavoro sporco” del &lt;em&gt;Task&lt;/em&gt; è eseguito dal codice presente in &lt;em&gt;ProcessJob&lt;/em&gt;, il quale verrà attivato (&lt;em&gt;BlobInput&lt;/em&gt;) ogni volta che un nuovo &lt;em&gt;Blob&lt;/em&gt; verrà caricato in “inputcontainer”. L’output è definito dall’attributo &lt;em&gt;BlobOutput&lt;/em&gt;, nello specifico la creazione di un nuovo Blob (immagine 200x200) nel container “outputcontainer”. Il codice di ridimensionamento è &lt;em&gt;out of scope&lt;/em&gt;. Il nome del &lt;em&gt;Blob&lt;/em&gt; in ingresso sarà uguale a quello di uscita in base al pattern specificato dal token “{name}”.&lt;/p&gt;

&lt;p&gt;Chi si occupa di gestire i &lt;em&gt;Bindings&lt;/em&gt;, di rimanere in “ascolto” e dei &lt;em&gt;Trigger&lt;/em&gt; è la classe &lt;em&gt;JobHost&lt;/em&gt; che puo’ essere inizializzata come specificato nel &lt;em&gt;Main&lt;/em&gt;. In questo caso si suppone che l’A&lt;em&gt;pp.config &lt;/em&gt;contenga le definizione delle due &lt;em&gt;ConnectionStrings&lt;/em&gt; necessarie rispettivamente per lavorare con lo &lt;em&gt;Storage&lt;/em&gt; di Azure (“AzureJobsData”) e con le attività di logging (“AzureJobsRuntime”):&lt;/p&gt;

&lt;pre class="csharpcode"&gt;  &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;connectionStrings&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;add&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;="AzureJobsRuntime"&lt;/span&gt;
         &lt;span class="attr"&gt;connectionString&lt;/span&gt;&lt;span class="kwrd"&gt;="DefaultEndpointsProtocol=https;AccountName=ACCOUNT_NAME;AccountKey=ACCOUNT_KEY"&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
    &lt;span class="kwrd"&gt;&amp;lt;&lt;/span&gt;&lt;span class="html"&gt;add&lt;/span&gt; &lt;span class="attr"&gt;name&lt;/span&gt;&lt;span class="kwrd"&gt;="AzureJobsData"&lt;/span&gt;
         &lt;span class="attr"&gt;connectionString&lt;/span&gt;&lt;span class="kwrd"&gt;="DefaultEndpointsProtocol=https;AccountName=ACCOUNT_NAME;AccountKey=ACCOUNT_KEY"&lt;/span&gt;&lt;span class="kwrd"&gt;/&amp;gt;&lt;/span&gt;
  &lt;span class="kwrd"&gt;&amp;lt;/&lt;/span&gt;&lt;span class="html"&gt;connectionStrings&lt;/span&gt;&lt;span class="kwrd"&gt;&amp;gt;&lt;/span&gt;&lt;/pre&gt;
&lt;style type="text/css"&gt;&lt;![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; }]]&gt;&lt;/style&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;Altrimenti è necessario specificare il nome delle due stringhe di connessione tramite costruttore della classe &lt;em&gt;JobHost&lt;/em&gt;. Le due connessioni possono coincidere ed ovviamente per eseguire l’esempio è necessario modificarle secondo il proprio account, sostituendo i valori di ACCOUNT_NAME e ACCOUNT_KEY.&lt;/p&gt;

&lt;p&gt;Il metodo “RunAndBlock()” esegue il &lt;em&gt;Task&lt;/em&gt; nello stesso &lt;em&gt;Thread&lt;/em&gt; attivo, mentre per utilizzare un &lt;em&gt;Background Thread&lt;/em&gt; è necessario invocare il metodo “RunOnBackgroundThread()” (che ritorna immediatamente il controllo al chiamante). &lt;/p&gt;

&lt;p&gt;Per testare il tutto possiamo premere F5 e dopo qualche secondo, se tutte le configurazioni sono corrette, dovremmo ottenere una &lt;em&gt;console&lt;/em&gt; simile alla seguente:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/WebJobs_CCDC/image_2.png"&gt;&lt;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/WebJobs_CCDC/image_thumb.png" width="244" height="126" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Questo implica che il nostro Job è in attesa di “fare qualcosa”. Per lavorare con lo storage di Windows Azure possiamo scaricare il Tool &lt;a href="http://azurestorageexplorer.codeplex.com/" target="_blank"&gt;“Azure Storage Explorer”&lt;/a&gt;. Una volta installato e configurato è possibile esplorare e modificare il nostro storage, nel mo caso, inizailmente abbiamo una situazione simile alla seguente:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/WebJobs_CCDC/image_6.png"&gt;&lt;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/WebJobs_CCDC/image_thumb_2.png" width="244" height="176" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Dopo aver selezionato la voce “inputcontainer” nella lista “Container”, scegliamo la voce “New” nella lista dei comandi “Blob”, specifichiamo il nome del nuovo &lt;em&gt;Blob&lt;/em&gt; e premiamo “Create Blob”:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/WebJobs_CCDC/image_8.png"&gt;&lt;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/WebJobs_CCDC/image_thumb_3.png" width="244" height="176" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Dalla lista dei &lt;em&gt;Blob&lt;/em&gt; presenti selezioniamo quello appena creato e scegliamo la voce “View” per visualizzarne i dettagli:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/WebJobs_CCDC/image_12.png"&gt;&lt;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/WebJobs_CCDC/image_thumb_5.png" width="244" height="162" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Click su “Upload Image File” per caricare una nuova immagine ed attendere il completamento delle operazioni di upload. Rieseguendo la nostra applicazione, dopo qualche secondo, dovremmo ottenere una &lt;em&gt;console&lt;/em&gt; di questo tipo:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/WebJobs_CCDC/image_14.png"&gt;&lt;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/WebJobs_CCDC/image_thumb_6.png" width="244" height="126" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;A questo punto ”outputcontainer” dovrebbe contenere un &lt;em&gt;Blob&lt;/em&gt; con lo stesso nome di quello di input e contenente un immagine di dimensione 200x200px:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/WebJobs_CCDC/image_16.png"&gt;&lt;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/WebJobs_CCDC/image_thumb_7.png" width="244" height="135" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Nella seconda parte del post vedremo come caricare l’eseguibile direttamente in un nostro Web Site ospitato su Windows Azure.&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/PietroLibroBlog/aggbug/101765.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Pietro Libro</dc:creator>
            <guid>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2014/02/05/windows-azure-webjobs-parte-1.aspx</guid>
            <pubDate>Wed, 05 Feb 2014 18:32:00 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2014/02/05/windows-azure-webjobs-parte-1.aspx#feedback</comments>
            <slash:comments>2</slash:comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/PietroLibroBlog/comments/commentRss/101765.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/PietroLibroBlog/services/trackbacks/101765.aspx</trackback:ping>
        </item>
        <item>
            <title>EF6 RTM Available</title>
            <link>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2013/10/17/ef6-rtm-available.aspx</link>
            <description>&lt;p&gt;Con il rilascio di VS 2013, puntuale anche il rilascio in RTM di Entity Framework 6, tutti i dettagli direttamente sul blog di &lt;a href="http://blogs.msdn.com/b/adonet/archive/2013/10/17/ef6-rtm-available.aspx#!" target="_blank"&gt;ADO.NET&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/PietroLibroBlog/aggbug/101699.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Pietro Libro</dc:creator>
            <guid>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2013/10/17/ef6-rtm-available.aspx</guid>
            <pubDate>Thu, 17 Oct 2013 16:25:00 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2013/10/17/ef6-rtm-available.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/PietroLibroBlog/comments/commentRss/101699.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/PietroLibroBlog/services/trackbacks/101699.aspx</trackback:ping>
        </item>
        <item>
            <title>Disponibile EF 6 RC</title>
            <link>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2013/08/22/disponibile-ef-6-rc.aspx</link>
            <description>&lt;p&gt;Rilasciata la RC di Entity Framework 6, tutti i dettagli e le novità rispetto alla Beta 1, &lt;a href="http://blogs.msdn.com/b/adonet/archive/2013/08/21/ef6-release-candidate-available.aspx" target="_blank"&gt;qui&lt;/a&gt;. &lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/PietroLibroBlog/aggbug/101644.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Pietro Libro</dc:creator>
            <guid>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2013/08/22/disponibile-ef-6-rc.aspx</guid>
            <pubDate>Thu, 22 Aug 2013 09:25:00 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2013/08/22/disponibile-ef-6-rc.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/PietroLibroBlog/comments/commentRss/101644.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/PietroLibroBlog/services/trackbacks/101644.aspx</trackback:ping>
        </item>
        <item>
            <title>VS 2013 (Preview) : ASP.NET External Authentication</title>
            <link>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2013/08/07/vs-2013-preview-external-authentication.aspx</link>
            <description>&lt;p&gt;Tra le novità di Visual Studio 2013 ed ASP.NET 4.5.1 , troviamo nuove opzioni per integrare applicazioni SPA (&lt;em&gt;Single Page Application&lt;/em&gt;) e Web API (ma non solo) con servizi di autenticazione esterni basati su Social come Twitter, Facebook, Google e Microsoft Accounts o basati su OAuth/OPenID (tutto a vantaggio di noi sviluppatori). Vediamo con un esempio.&lt;/p&gt;  &lt;p&gt;Apriamo VS 2013 (Preview) e selezioniamo come template “ASP.NET Web Application”:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/VS_7782/image_2.png"&gt;&lt;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/VS_7782/image_thumb.png" width="244" height="131" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Scegliamo il progetto di tipo SPA  che di base utilizza HTML5, CSS3 e ASP.NET Web API (una semplice applicazione “Todo List”):&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/VS_7782/image_4.png"&gt;&lt;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/VS_7782/image_thumb_1.png" width="244" height="153" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;A questo punto il gioco è quasi finito, nella &lt;em&gt;Solution Explorer&lt;/em&gt; apriamo il file &lt;em&gt;App_Start\Startup.Auth.cs&lt;/em&gt; e decommentiamo la riga relativa “UseGoogleAuthentication”:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/VS_7782/image_6.png"&gt;&lt;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/VS_7782/image_thumb_2.png" width="241" height="244" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Eseguiamo l’applicazione con F5, e dalla schermata principale possiamo scegliere se autenticarci in modalità classica oppure utilizzando un servizio di autenticazione esterno (nello specifico “Google”):&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/VS_7782/image_8.png"&gt;&lt;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/VS_7782/image_thumb_3.png" width="244" height="136" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Decommentando le opportune righe di codice è possibile offrire agli utenti piu’ servizi di autenticazione, ad esempio, per aggiungere anche “Microsoft Authentication” (è necessario possedere un account come developer qui : &lt;a title="http://go.microsoft.com/fwlink/?LinkID=144070" href="http://go.microsoft.com/fwlink/?LinkID=144070"&gt;http://go.microsoft.com/fwlink/?LinkID=144070&lt;/a&gt;)  modifichiamo il file di codice precedente aggiungendo “ClientId” and “Client Secret” come richiesto:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/VS_7782/image_14.png"&gt;&lt;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/VS_7782/image_thumb_6.png" width="244" height="213" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Eseguiamo con F5, ed ecco il risultato:&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/VS_7782/image_10.png"&gt;&lt;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/VS_7782/image_thumb_4.png" width="244" height="140" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Semplice, no ?&lt;/p&gt;  &lt;p&gt;Tutti gli approfondimenti del caso, sul sito di ASP.NET: &lt;a title="http://www.asp.net/web-api/overview/security/external-authentication-services" href="http://www.asp.net/web-api/overview/security/external-authentication-services"&gt;http://www.asp.net/web-api/overview/security/external-authentication-services&lt;/a&gt;&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/PietroLibroBlog/aggbug/101636.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Pietro Libro</dc:creator>
            <guid>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2013/08/07/vs-2013-preview-external-authentication.aspx</guid>
            <pubDate>Wed, 07 Aug 2013 10:13:00 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/PietroLibroBlog/archive/2013/08/07/vs-2013-preview-external-authentication.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/PietroLibroBlog/comments/commentRss/101636.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/PietroLibroBlog/services/trackbacks/101636.aspx</trackback:ping>
        </item>
    </channel>
</rss>