<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>ASP.NET</title>
        <link>http://blogs.ugidotnet.org/pietrolibroblog/category/ASP.NET.aspx</link>
        <description>ASP.NET</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>Documentazione EF 7 (Beta 5)</title>
            <link>http://blogs.ugidotnet.org/pietrolibroblog/archive/2015/07/22/documentazione-ef-7-beta-5.aspx</link>
            <description>Documentazione "Work in Progress" della prossima release di Entity Framework : &lt;a href="http://ef.readthedocs.org/en/latest/" target="_blank"&gt;http://ef.readthedocs.org/en/latest/&lt;/a&gt;&lt;img src="http://blogs.ugidotnet.org/pietrolibroblog/aggbug/102030.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Pietro Libro</dc:creator>
            <guid>http://blogs.ugidotnet.org/pietrolibroblog/archive/2015/07/22/documentazione-ef-7-beta-5.aspx</guid>
            <pubDate>Wed, 22 Jul 2015 09:07:28 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/pietrolibroblog/archive/2015/07/22/documentazione-ef-7-beta-5.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/pietrolibroblog/comments/commentRss/102030.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/pietrolibroblog/services/trackbacks/102030.aspx</trackback:ping>
        </item>
        <item>
            <title>JSON.Merge</title>
            <link>http://blogs.ugidotnet.org/pietrolibroblog/archive/2014/08/29/json.merge.aspx</link>
            <description>&lt;p&gt;Un’interessante novità introdotta con la versione 6.0 release 4 di Json.NET è la possibilità di eseguire il &lt;em&gt;Merge&lt;/em&gt; (utilizzando 4 possibili “variazioni”) di oggetti &lt;em&gt;JObject&lt;/em&gt; e &lt;em&gt;Jarray&lt;/em&gt;. Un rapido esempio, tramite Web Api:&lt;/p&gt;  &lt;pre class="brush: csharp;"&gt;[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&amp;lt;Car&amp;gt;(); 
}&lt;/pre&gt;

&lt;p&gt;Dove &lt;em&gt;l’Action&lt;/em&gt; “JsonStringPost” accetta una stringa tipo:&lt;/p&gt;

&lt;p&gt;"{ 'Brand': 'Ferrari','Model': 'f450 Modena','Optionals': [] }"&lt;/p&gt;

&lt;p&gt;Utilizzando, ad esempio il &lt;em&gt;Composer&lt;/em&gt; di strumenti come &lt;a href="http://www.telerik.com/fiddler" target="_blank"&gt;Fiddler2&lt;/a&gt; possiamo invocare il servizio:&lt;/p&gt;
&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/JSON.Merge_A854/image_5.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/JSON.Merge_A854/image_thumb_1.png" width="244" height="238" /&gt;&lt;/a&gt; 

&lt;p&gt;Per ottenere una nuova istanza di &lt;em&gt;Car&lt;/em&gt; con tutti gli &lt;em&gt;Optionals&lt;/em&gt;:&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/JSON.Merge_A854/image_7.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/JSON.Merge_A854/image_thumb_2.png" width="244" height="74" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;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:&lt;/p&gt;

&lt;pre class="brush: csharp;"&gt;[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&lt;car&gt;();
}&lt;/car&gt;&lt;/pre&gt;

&lt;p&gt;Dove utilizziamo il metodo &lt;em&gt;FromObject&lt;/em&gt; della classe &lt;em&gt;JObject&lt;/em&gt; invece di &lt;em&gt;Parse. &lt;/em&gt;Utilizzando Fiddler, passando come &lt;em&gt;Body&lt;/em&gt; del messaggio la stringa (senza i doppi apici ad inizio e fine stringa)&lt;/p&gt;

&lt;p&gt;{ 'Brand': 'Ferrari','Model': 'f450 Modena','Optionals': [] }&lt;/p&gt;

&lt;p&gt;Otteniamo (ovviamente) lo stesso risultato dell’invocazione precedente. E’ possibile modificare il comportamento di “Merge” utilizzando l’enumerazione &lt;em&gt;MergeArrayHandling. &lt;/em&gt;La classe &lt;em&gt;Car &lt;/em&gt;(C#) è descritta nell’esempio, è la seguente:&lt;/p&gt;

&lt;pre class="brush: csharp;"&gt;public class Car
{
    public string Brand { get; set; }
    public string Model { get; set; }
    public string[] Optionals { get; set; }
}&lt;/pre&gt;

&lt;p&gt;La lista completa delle &lt;em&gt;features&lt;/em&gt; aggiunte nel rilascio della versione 6.0 release 4 è disponibile &lt;a href="http://james.newtonking.com/archive/2014/08/04/json-net-6-0-release-4-json-merge-dependency-injection" target="_blank"&gt;qui&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/pietrolibroblog/aggbug/101880.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Pietro Libro</dc:creator>
            <guid>http://blogs.ugidotnet.org/pietrolibroblog/archive/2014/08/29/json.merge.aspx</guid>
            <pubDate>Fri, 29 Aug 2014 13:30:00 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/pietrolibroblog/archive/2014/08/29/json.merge.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/pietrolibroblog/comments/commentRss/101880.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/pietrolibroblog/services/trackbacks/101880.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 3)</title>
            <link>http://blogs.ugidotnet.org/pietrolibroblog/archive/2014/02/11/windows-azure-webjobs-parte-3.aspx</link>
            <description>&lt;p&gt;Torniamo ancora sull’argomento “WebJobs” descrivendo brevemente le varie modalità di &lt;em&gt;Triggering&lt;/em&gt;:&lt;/p&gt;  &lt;ul&gt;   &lt;li&gt;Alla creazione di un nuovo &lt;em&gt;Blob&lt;/em&gt; &lt;/li&gt;    &lt;li&gt;Alla ricezione di un nuovo &lt;em&gt;Queue Message&lt;/em&gt; &lt;/li&gt;    &lt;li&gt;Esplicatamente tramite l’invocazione della funzione &lt;em&gt;Call&lt;/em&gt; &lt;/li&gt; &lt;/ul&gt;  &lt;p&gt;Nei post precedenti (&lt;a href="http://blogs.ugidotnet.org/PietroLibroBlog/archive/2014/02/05/windows-azure-webjobs-parte-1.aspx" target="_blank"&gt;parte 1&lt;/a&gt; e &lt;a href="http://blogs.ugidotnet.org/PietroLibroBlog/archive/2014/02/06/windows-azure-webjobs-parte-2.aspx" target="_blank"&gt;parte 2&lt;/a&gt;) abbiamo visto come attivare il &lt;em&gt;Trigger&lt;/em&gt; del “WebJob” alla creazione di un nuovo &lt;em&gt;Blob&lt;/em&gt; all’interno di un &lt;em&gt;container&lt;/em&gt; specifico semplicemente utilizzando l’attributo &lt;em&gt;[BlobInput].&lt;/em&gt; Con le stesse modalità é possibile eseguire il &lt;em&gt;Binding&lt;/em&gt; di una funzione invocata dall’instanza di &lt;em&gt;JobHost&lt;/em&gt; al ricevimento di un messaggio in un specifica coda (&lt;em&gt;Queue&lt;/em&gt;) come da esempio:&lt;/p&gt;  &lt;pre class="csharpcode"&gt;&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; ProcessBobByQueueMessage([QueueInput(&lt;span class="str"&gt;@"inputqueue"&lt;/span&gt;)] &lt;span class="kwrd"&gt;string&lt;/span&gt; message,
    [BlobOutput(&lt;span class="str"&gt;@"outputcontainer/resized_image.png"&lt;/span&gt;)] Stream outputStream)
{

    &lt;span class="kwrd"&gt;if&lt;/span&gt; (!message.Equals(&lt;span class="str"&gt;"go"&lt;/span&gt;))
        &lt;span class="kwrd"&gt;return&lt;/span&gt;;

    CloudStorageAccount storageAccount = CloudStorageAccount.Parse(
        System.Configuration.ConfigurationManager.ConnectionStrings[&lt;span class="str"&gt;"AzureJobsData"&lt;/span&gt;]
        .ConnectionString);

    CloudBlobClient blobClient = storageAccount.CreateCloudBlobClient();
    CloudBlobContainer container = blobClient.GetContainerReference(&lt;span class="str"&gt;"inputcontainer"&lt;/span&gt;);
    CloudBlob blob = container.GetBlobReference(&lt;span class="str"&gt;"TestPicture"&lt;/span&gt;);

    Stream inputStream = &lt;span class="kwrd"&gt;new&lt;/span&gt; MemoryStream();

    blob.DownloadToStream(inputStream);

    ResizeImage(inputStream, outputStream);
}&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;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 &lt;em&gt;Blob&lt;/em&gt; nel &lt;em&gt;container&lt;/em&gt; “outputcontainer” con il nome di “resized_image.png”. Da notare che nel codice utilizziamo le clasi del namespace&lt;em&gt; Microsoft.WindowsAzure.StorageClient &lt;/em&gt;per lavorare con le classi che rappresentano lo &lt;em&gt;storage&lt;/em&gt; di Windows Azure. Per testare il tutto é sufficiente caricare il &lt;em&gt;Job&lt;/em&gt; 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:&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-3_DAA1/image_2.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-3_DAA1/image_thumb.png" width="244" height="176" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;E nel &lt;em&gt;container&lt;/em&gt; di output avremo:&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-3_DAA1/image_4.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-3_DAA1/image_thumb_1.png" width="244" height="141" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Dal codice si evince come il nome del &lt;em&gt;Blob&lt;/em&gt; 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 (&lt;em&gt;Blob&lt;/em&gt;) di &lt;em&gt;Input&lt;/em&gt; ed &lt;em&gt;Output&lt;/em&gt; e passata come messaggio testo alla coda, tradotto in codice:&lt;/p&gt;

&lt;pre class="csharpcode"&gt; &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; ProcessBobByQueueCustomMessage([QueueInput(&lt;span class="str"&gt;@"inputqueue"&lt;/span&gt;)] ImageMessage message,
[BlobOutput(&lt;span class="str"&gt;@"outputcontainer/{OutputName}"&lt;/span&gt;)] Stream outputStream)
{
    CloudStorageAccount storageaccount = CloudStorageAccount.Parse(
       System.Configuration.ConfigurationManager.ConnectionStrings[&lt;span class="str"&gt;"AzureJobsData"&lt;/span&gt;]
       .ConnectionString);

    CloudBlobClient blobclient = storageaccount.CreateCloudBlobClient();
    CloudBlobContainer container = blobclient.GetContainerReference(&lt;span class="str"&gt;"inputcontainer"&lt;/span&gt;);
    CloudBlob blob = container.GetBlobReference(message.InputName);

    Stream inputStream = &lt;span class="kwrd"&gt;new&lt;/span&gt; MemoryStream();

    blob.DownloadToStream(inputStream);

    ResizeImage(inputStream, outputStream);
}&lt;/pre&gt;

&lt;p&gt; &lt;/p&gt;

&lt;p&gt;Da notare l’utilizzo del &lt;em&gt;placeHolder &lt;/em&gt;“{OutputName}” specificato nel percorso (&lt;em&gt;BlobPath&lt;/em&gt;) ed accettato come argomento dall’attributo &lt;em&gt;BlobPath&lt;/em&gt;, uguale alla proprietà omonima della classe &lt;em&gt;ImageMessage&lt;/em&gt;, ed utilizzata per definire il nome del &lt;em&gt;Blob&lt;/em&gt; di output in questo modo:&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; ImageMessage
{
    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; InputName { get; set; }
    &lt;span class="kwrd"&gt;public&lt;/span&gt; &lt;span class="kwrd"&gt;string&lt;/span&gt; OutputName { 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;Per un giro di test è sufficiente creare un nuovo messagio con il testo seguente:&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-3_DAA1/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/Windows-Azure-WebJobs-parte-3_DAA1/image_thumb_2.png" width="244" height="122" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Ottenendo:&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-3_DAA1/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-3_DAA1/image_thumb_3.png" width="244" height="136" /&gt;&lt;/a&gt;&lt;/p&gt;



&lt;p&gt;Interessante è l’utilizzo dell’attributo [&lt;em&gt;NoAutomaticTrigger()&lt;/em&gt;] 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 &lt;em&gt;[QueueInput(…)]&lt;/em&gt; in quanto a runtime solleva un’eccezione con il messaggio seguente: &lt;em&gt;“Can't have QueueInput and NoAutomaticTrigger on the same function.”.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Per invocare programmaticamente una funzione è sufficiente utilizzare il metodo &lt;em&gt;Call()&lt;/em&gt; della classe JobHost:&lt;/p&gt;

&lt;pre class="csharpcode"&gt;host.Call(methodInfo);&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;Dove “methodInfo” puo’ essere facilmente calcolato tramite &lt;em&gt;Reflection&lt;/em&gt;.&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/pietrolibroblog/aggbug/101771.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Pietro Libro</dc:creator>
            <guid>http://blogs.ugidotnet.org/pietrolibroblog/archive/2014/02/11/windows-azure-webjobs-parte-3.aspx</guid>
            <pubDate>Tue, 11 Feb 2014 12:27:00 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/pietrolibroblog/archive/2014/02/11/windows-azure-webjobs-parte-3.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/pietrolibroblog/comments/commentRss/101771.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/pietrolibroblog/services/trackbacks/101771.aspx</trackback:ping>
        </item>
        <item>
            <title>ASP.NET Dynamic Data provider (preview) per EF6</title>
            <link>http://blogs.ugidotnet.org/pietrolibroblog/archive/2014/01/31/asp.net-dynamic-data-provider-preview-per-ef6.aspx</link>
            <description>&lt;p&gt;Rilasciato un aggiornamento per &lt;em&gt;ASP.NET DynamicData&lt;/em&gt; e &lt;em&gt;DataSourceControl&lt;/em&gt; per Entity Framework 6. Tutti i dettagli del caso sul &lt;a href="http://blogs.msdn.com/b/webdev/archive/2014/01/30/announcing-preview-of-dynamic-data-provider-and-entitydatasource-control-for-entity-framework-6.aspx" target="_blank"&gt;blog originale&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/pietrolibroblog/aggbug/101763.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Pietro Libro</dc:creator>
            <guid>http://blogs.ugidotnet.org/pietrolibroblog/archive/2014/01/31/asp.net-dynamic-data-provider-preview-per-ef6.aspx</guid>
            <pubDate>Fri, 31 Jan 2014 10:23:00 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/pietrolibroblog/archive/2014/01/31/asp.net-dynamic-data-provider-preview-per-ef6.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/pietrolibroblog/comments/commentRss/101763.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/pietrolibroblog/services/trackbacks/101763.aspx</trackback:ping>
        </item>
        <item>
            <title>Web Api e Debug su Azure</title>
            <link>http://blogs.ugidotnet.org/pietrolibroblog/archive/2013/11/19/web-api-e-debug-su-azure.aspx</link>
            <description>&lt;p&gt;Se abbiamo la necessità di debuggare le nostre Web Api pubblicate su Azure, i passi da seguire sono veramente pochi e semplici:&lt;/p&gt;  &lt;ol&gt;   &lt;li&gt;Download ed installazione di Azure SDK 2.2 &lt;/li&gt;    &lt;li&gt;Aprire la &lt;em&gt;Solution &lt;/em&gt;contenente&lt;em&gt; &lt;/em&gt;il progetto Web con la definizione delle Web API &lt;/li&gt;    &lt;li&gt;Connettersi a &lt;em&gt;Windows Azure&lt;/em&gt; tramite l’apposito link in &lt;em&gt;Server Explorer&lt;/em&gt;:       &lt;br /&gt;      &lt;br /&gt;      &lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/Web-Api-Debug-su-Azure_783C/image_2.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/Web-Api-Debug-su-Azure_783C/image_thumb.png" width="244" height="156" /&gt;&lt;/a&gt;&lt;/p&gt;   &lt;/li&gt;    &lt;li&gt;Pubblicare il progetto (in Debug):      &lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/Web-Api-Debug-su-Azure_783C/image_8.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/Web-Api-Debug-su-Azure_783C/image_thumb_3.png" width="244" height="92" /&gt;&lt;/a&gt; &lt;/p&gt;      &lt;br /&gt;      &lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/Web-Api-Debug-su-Azure_783C/image_4.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/Web-Api-Debug-su-Azure_783C/image_thumb_1.png" width="244" height="105" /&gt;&lt;/a&gt;&lt;/p&gt;      &lt;br /&gt;&lt;/li&gt;    &lt;li&gt;Utilizzare la funzione &lt;i&gt;Attach debugger&lt;/i&gt; per il &lt;em&gt;Web Site&lt;/em&gt; oggetto del &lt;em&gt;Debug&lt;/em&gt;:       &lt;p&gt; &lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/Web-Api-Debug-su-Azure_783C/image_10.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/Web-Api-Debug-su-Azure_783C/image_thumb_4.png" width="244" height="193" /&gt;&lt;/a&gt;         &lt;br /&gt;&lt;/p&gt;   &lt;/li&gt;    &lt;li&gt;Si apre una nuova finestra del Browser con il &lt;em&gt;Web Site&lt;/em&gt; &lt;/li&gt;    &lt;li&gt;Aggiungiamo dove necessario i &lt;em&gt;breakpoint&lt;/em&gt; nel codice (ad esempio su un’azione di GET del nostro &lt;em&gt;Controller&lt;/em&gt;) &lt;/li&gt;    &lt;li&gt;Invochiamo l’URL e per “magia” (la prima volta puo’ impiegare qualche di tempo) ci troviamo a debuggare la nostra applicazione appena pubblicata:      &lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/Web-Api-Debug-su-Azure_783C/image_12.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/Web-Api-Debug-su-Azure_783C/image_thumb_5.png" width="244" height="72" /&gt;&lt;/a&gt;&lt;/p&gt;   &lt;/li&gt; &lt;/ol&gt;  &lt;p&gt;N.B: I passi precedenti si riferiscono all’utilizzo di VS 2013, per VS 2012 bisogna abilitare il &lt;em&gt;remote debugging&lt;/em&gt; tramite il portale della nostra sottoscrizione Azure&lt;/p&gt;  &lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/Windows-Live-Writer/Web-Api-Debug-su-Azure_783C/image_14.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/Web-Api-Debug-su-Azure_783C/image_thumb_6.png" width="244" height="126" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/pietrolibroblog/aggbug/101726.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Pietro Libro</dc:creator>
            <guid>http://blogs.ugidotnet.org/pietrolibroblog/archive/2013/11/19/web-api-e-debug-su-azure.aspx</guid>
            <pubDate>Tue, 19 Nov 2013 10:40:00 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/pietrolibroblog/archive/2013/11/19/web-api-e-debug-su-azure.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/pietrolibroblog/comments/commentRss/101726.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/pietrolibroblog/services/trackbacks/101726.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>
        <item>
            <title>ASP.NET Web Api a Codemotion Roma 2013</title>
            <link>http://blogs.ugidotnet.org/pietrolibroblog/archive/2013/03/22/asp.net-web-api-a-codemotion-roma-2013.aspx</link>
            <description>&lt;p&gt;Se domani non avete proprio nulla da fare :-) possiamo vederci a Codemotion 2013 Roma.&lt;/p&gt;  &lt;p&gt; &lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/WindowsLiveWriter/ASP.NETWebApiaCodemotionRoma2013_106C0/image_2.png"&gt;&lt;img title="image" style="border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline" border="0" alt="image" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/WindowsLiveWriter/ASP.NETWebApiaCodemotionRoma2013_106C0/image_thumb.png" width="437" height="228" /&gt;&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;Una sessione introduttiva all’utilizzo del Framework ASP.NET Web Api per lo sviluppo di applicazioni RESTful.&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/pietrolibroblog/aggbug/101485.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Pietro Libro</dc:creator>
            <guid>http://blogs.ugidotnet.org/pietrolibroblog/archive/2013/03/22/asp.net-web-api-a-codemotion-roma-2013.aspx</guid>
            <pubDate>Fri, 22 Mar 2013 19:39:00 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/pietrolibroblog/archive/2013/03/22/asp.net-web-api-a-codemotion-roma-2013.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/pietrolibroblog/comments/commentRss/101485.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/pietrolibroblog/services/trackbacks/101485.aspx</trackback:ping>
        </item>
        <item>
            <title>ASP.NET and Web Tools 2012.2  : Web Api Help Page</title>
            <link>http://blogs.ugidotnet.org/pietrolibroblog/archive/2013/03/09/asp.net-and-web-tools-2012.2-web-api-page.aspx</link>
            <description>&lt;p&gt;Con il rilascio dell’&lt;a href="http://blogs.ugidotnet.org/PietroLibroBlog/archive/2013/02/20/asp.net-and-web-tools-2012.2-update.aspx" target="_blank"&gt;aggiornamento ASP.NET 2012.2&lt;/a&gt; di qualche settimana fa,  lo sviluppo di una “Help Page” per Web Api, utilizzando l’apposito &lt;em&gt;Package&lt;/em&gt; di NuGet, é un’attività che impegna meno di 5 minuti (per completezza di informazione, era già presente una versione alpha del &lt;em&gt;Package&lt;/em&gt; prima del rilascio ufficiale).&lt;/p&gt;
&lt;p&gt;1) Dalle “references” del progetto Web da “documentare”, apriamo la finestra per la gestione dei “Packages” di NuGet:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/WindowsLiveWriter/ASP.NETandWebTools2012.2WebApiPage_C1CA/image_2.png"&gt;&lt;img width="244" height="111" border="0" title="image" style="border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline" alt="image" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/WindowsLiveWriter/ASP.NETandWebTools2012.2WebApiPage_C1CA/image_thumb.png" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;2) Cerchiamo la voce “Web Api Help Page” e clicchiamo su “Install” (verranno installate le dipendenze necessarie):&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/WindowsLiveWriter/ASP.NETandWebTools2012.2WebApiPage_C1CA/image_4.png"&gt;&lt;img width="244" height="175" border="0" title="image" style="border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline" alt="image" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/WindowsLiveWriter/ASP.NETandWebTools2012.2WebApiPage_C1CA/image_thumb_1.png" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;3) Al progetto verrà aggiunta l’area “HelpPage” sotto la cartella “Areas”, con tutte le classi necessarie (&lt;em&gt;css&lt;/em&gt; compreso):&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/WindowsLiveWriter/ASP.NETandWebTools2012.2WebApiPage_C1CA/image_6.png"&gt;&lt;img width="244" height="175" border="0" title="image" style="border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline" alt="image" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/WindowsLiveWriter/ASP.NETandWebTools2012.2WebApiPage_C1CA/image_thumb_2.png" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;4) La classe &lt;em&gt;XmlDocumentationProvider  &lt;/em&gt;che&lt;em&gt; &lt;/em&gt;implementa l’interfaccia &lt;em&gt;IDocumentationProvider&lt;/em&gt; permette di documentare le nostre API nel caso più semplice utilizzando i commenti che decorano le Web API direttamente nel codice (implementando l’interfaccia &lt;em&gt;IDocumentationProvider &lt;/em&gt;é possibile personalizzare questo comportamento).&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/WindowsLiveWriter/ASP.NETandWebTools2012.2WebApiPage_C1CA/image_8.png"&gt;&lt;img width="244" height="69" border="0" title="image" style="border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline" alt="image" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/WindowsLiveWriter/ASP.NETandWebTools2012.2WebApiPage_C1CA/image_thumb_3.png" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;5) Aggiungiamo nel &lt;em&gt;Global.asax.cs&lt;/em&gt; la riga di codice seguente:&lt;/p&gt;
&lt;pre class="csharpcode"&gt;config.Services.Replace(&lt;span class="kwrd"&gt;typeof&lt;/span&gt;(IDocumentationProvider), &lt;span class="kwrd"&gt;new&lt;/span&gt; XmlDocumentationProvider(HttpContext.Current.Server.MapPath(&lt;span class="str"&gt;"~/App_Data/file.xml"&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;  &lt;/p&gt;
&lt;p&gt;  &lt;/p&gt;
&lt;p&gt;6) A questo punto non ci resta che eseguire la nostra applicazione e digitare “Help” nella barra degli indirizzi:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/WindowsLiveWriter/ASP.NETandWebTools2012.2WebApiPage_C1CA/image_10.png"&gt;&lt;img width="244" height="126" border="0" title="image" style="border-top: 0px; border-right: 0px; border-bottom: 0px; border-left: 0px; display: inline" alt="image" src="http://blogs.ugidotnet.org/images/blogs_ugidotnet_org/PietroLibroBlog/WindowsLiveWriter/ASP.NETandWebTools2012.2WebApiPage_C1CA/image_thumb_4.png" /&gt;&lt;/a&gt; &lt;/p&gt;
&lt;p&gt;A questo punto é sufficiente passare alle personalizzazioni del caso :-).&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/pietrolibroblog/aggbug/101466.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Pietro Libro</dc:creator>
            <guid>http://blogs.ugidotnet.org/pietrolibroblog/archive/2013/03/09/asp.net-and-web-tools-2012.2-web-api-page.aspx</guid>
            <pubDate>Sat, 09 Mar 2013 14:46:00 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/pietrolibroblog/archive/2013/03/09/asp.net-and-web-tools-2012.2-web-api-page.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/pietrolibroblog/comments/commentRss/101466.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/pietrolibroblog/services/trackbacks/101466.aspx</trackback:ping>
        </item>
        <item>
            <title>ASP.NET and Web Tools 2012.2 Update</title>
            <link>http://blogs.ugidotnet.org/pietrolibroblog/archive/2013/02/20/asp.net-and-web-tools-2012.2-update.aspx</link>
            <description>&lt;p&gt;Rilasciata la versione finale di “ASP.NET and Web Tools 2012.2 Update”, un download che arrichisce, non di poco, le funzionalità esistenti, in Visual Studio 2012 e ASP.NET (tra le novità, OData EndPoint in ASP.NET Web API, ASP.NET SignalR, Single Page Applications).  Tutti i dettagli del caso sul &lt;a href="http://weblogs.asp.net/scottgu/archive/2013/02/18/announcing-release-of-asp-net-and-web-tools-2012-2-update.aspx" target="_blank"&gt;post originale&lt;/a&gt; sul blog di Scott Guthrie.&lt;/p&gt;&lt;img src="http://blogs.ugidotnet.org/pietrolibroblog/aggbug/101445.aspx" width="1" height="1" /&gt;</description>
            <dc:creator>Pietro Libro</dc:creator>
            <guid>http://blogs.ugidotnet.org/pietrolibroblog/archive/2013/02/20/asp.net-and-web-tools-2012.2-update.aspx</guid>
            <pubDate>Wed, 20 Feb 2013 09:32:00 GMT</pubDate>
            <comments>http://blogs.ugidotnet.org/pietrolibroblog/archive/2013/02/20/asp.net-and-web-tools-2012.2-update.aspx#feedback</comments>
            <wfw:commentRss>http://blogs.ugidotnet.org/pietrolibroblog/comments/commentRss/101445.aspx</wfw:commentRss>
            <trackback:ping>http://blogs.ugidotnet.org/pietrolibroblog/services/trackbacks/101445.aspx</trackback:ping>
        </item>
    </channel>
</rss>