<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Le blog de Hinault Romaric Donfack &#187; ASP.NET MVC 4</title>
	<atom:link href="https://blog.developpez.com/lilroma/pcategory/net/asp-net/asp-net-mvc-4/feed" rel="self" type="application/rss+xml" />
	<link>https://blog.developpez.com/lilroma</link>
	<description>Bienvenue sur ce blog. Vous y trouverez du .NET, du .NET...  encore du .NET, toujours du .NET et très peu de chose sur moi</description>
	<lastBuildDate>Sat, 27 Aug 2016 14:24:30 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.1.42</generator>
	<item>
		<title>« ASP.NET et Web Tools 2012.2 » sort en RC, avec de nouvelles fonctionnalités pour WebForms, MVC, WebAPI et SignalR</title>
		<link>https://blog.developpez.com/lilroma/p11585/net/asp-net-et-web-tools-2012-2-sort-en-rc-avec-de-nouvelles-fonctionnalites-pour-webforms-mvc-webapi-et-signalr</link>
		<comments>https://blog.developpez.com/lilroma/p11585/net/asp-net-et-web-tools-2012-2-sort-en-rc-avec-de-nouvelles-fonctionnalites-pour-webforms-mvc-webapi-et-signalr#comments</comments>
		<pubDate>Tue, 18 Dec 2012 16:51:09 +0000</pubDate>
		<dc:creator><![CDATA[Hinault Romaric]]></dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[ASP.NET MVC 4]]></category>
		<category><![CDATA[ASP.NET Web API]]></category>
		<category><![CDATA[Visual Studio]]></category>
		<category><![CDATA[WebPages]]></category>

		<guid isPermaLink="false">http://blog.developpez.com/lilroma/?p=104</guid>
		<description><![CDATA[« ASP.NET et Web Tools 2012.2 » sort en RC, avec de nouvelles fonctionnalités pour WebForms, MVC et WebAPI Le Web évolue rapidement, et Microsoft est conscient de cela. L’éditeur a ainsi adopté un cycle de mise à jour pour &#8230; <a href="https://blog.developpez.com/lilroma/p11585/net/asp-net-et-web-tools-2012-2-sort-en-rc-avec-de-nouvelles-fonctionnalites-pour-webforms-mvc-webapi-et-signalr">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>« ASP.NET et Web Tools 2012.2 » sort en RC, avec de nouvelles fonctionnalités pour WebForms, MVC et WebAPI </p>
<p>Le Web évolue rapidement, et Microsoft est conscient de cela. L’éditeur a ainsi adopté un cycle de mise à jour pour ASP.NET plus rapide que celui de Visual Studio.</p>
<p>La société compte donc publier une mise à jour pour sa plateforme de développement Web ASP.NET en début d’année prochaine.</p>
<p>Les développeurs qui veulent commencer à « jouer » avec les nouvelles fonctionnalités de cette mise à jour peuvent déjà télécharger sa version Release Candidate (RC) qui vient d’être publiée par les équipes  ASP.NET et Visual Web Developer de Microsoft.</p>
<p><img src="http://rdonfack.developpez.com/images/aspnevnext.png" alt="" /></p>
<p><span id="more-104"></span></p>
<p>« ASP.NET et Web Tools 2012.2 » RC étend le runtine ASP.NET existant et ajout de nouveaux outils Web à Visual Studio 2012 pour WebForms, MVC, WebAPI, etc. Il s’agit des fonctionnalités suivantes :</p>
<ol>
<li>De nouveaux modèles de projets ASP.NET MVC. la création d’applications Facebook est désormais plus facile avec le modèle Facebook, qui permet en quelques étapes de créer une application qui interagir avec le réseau social. Le nouveau modèle « Single Page Application » permet aux développeurs de créer des applications Web interactives côté client à l’aide de jQuery, Knockout et ASP.NET Web API ;</li>
<li>Le support de la communication en temps réel avec ASP.NET SignalR. SignalR est une bibliothèque client/serveur qui permet aux clients basés sur un navigateur et aux composants serveur basés sur ASP.NET d&rsquo;avoir une conversation à étapes multiples et bidirectionnelle;</li>
<li>Le support de l’IntelliSense pour Knockout  et l’ajout de la prise en charge de JSON en tant que classe ;
</li>
<li>L’introduction de nouvelles fonctionnalités pour ASP.NET Web API, y compris le support d’OData, l’ajout des fonctions de traçabilité, de monitoring et  de génération d’une page d’aide pour une API Web;</li>
<li>Des améliorations de l’inspecteur de page, qui offre désormais de meilleures performances pour JavaScript et CSS, dont la capacité de voir les mises à jour en temps réel d’un fichier CSS ;</li>
<li>L’unification de l’expérience de publication pour une application Web et un projet de type site Web, ainsi que l’ajout des options de publication sélective ;</li>
<li>L’intégration de la nouvelle fonctionnalité ASP.NET Friendly URL. Cette fonction rend facile la génération des URL sans l’extension .aspx. Elle permet également au développeur d’ajouter plus facilement le support du mobile dans son application Web ;</li>
<li>La mise à jour des modèles de projets Web dans Visual Studio 2012.</li>
</ol>
<p>Cette mise à jour est livrée comme des packages NuGet supplémentaires. Ce qui signifie qu’il ne peut avoir aucun problème de compatibilité avec les projets existants.</p>
<p><strong><a href="http://www.asp.net/vnext">Télécharger &laquo;&nbsp;ASP.NET et Web Tools 2012.2&Prime; RC</a></strong></p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Consommer une API Web avec HttpClient</title>
		<link>https://blog.developpez.com/lilroma/p11330/net/consommer-une-api-web-avec-httpclient</link>
		<comments>https://blog.developpez.com/lilroma/p11330/net/consommer-une-api-web-avec-httpclient#comments</comments>
		<pubDate>Thu, 20 Sep 2012 20:55:30 +0000</pubDate>
		<dc:creator><![CDATA[Hinault Romaric]]></dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[ASP.NET Web API]]></category>

		<guid isPermaLink="false">http://blog.developpez.com/lilroma/?p=92</guid>
		<description><![CDATA[Dans un précédent article, j&#8217;ai présenté ASP.NET Web API, la nouveauté phare de ASP.NET MVC 4, qui a pour objectif principal de permettre aux développeurs d’exposer leurs applications, données et services sur le web directement à travers HTTP. Le support &#8230; <a href="https://blog.developpez.com/lilroma/p11330/net/consommer-une-api-web-avec-httpclient">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Dans <a href="http://blog.developpez.com/lilroma/p10768/">un précédent article</a>, j&rsquo;ai présenté ASP.NET Web API, la nouveauté phare de ASP.NET MVC 4, qui a  pour objectif principal de permettre aux développeurs d’exposer leurs applications, données et services sur le web directement à travers HTTP. Le support d’ASP.NET Web API permet de créer facilement des API Web puissantes, qui peuvent être consultées à partir d’un large éventail de client (réseaux sociaux, navigateurs, terminaux mobiles, etc.).</p>
<p>Dans ce article, nous avons créer une première API et consommer celle-ci dans une page Web en utilisant jQuery. Dans ce billet de blog, je vais vous montrer comment vous pouvez interagir avec votre API dans une application native en utilisant HttpClient.</p>
<p><span id="more-92"></span></p>
<p>Dans une application Web, vous pouvez simplement interagir avec une API Web coté client en appelant les requêtes HTTP Get, Put, Post et Delete dans un Script JavaScript ou en utilisant jQuery. Mais, si vous voulez accéder à votre API à partir d’une application Desktop par exemple, comment procéder ?</p>
<p>C’est à ce niveau qu’intervient HTTPClient. HTTPClient est un client moderne HTTP pour les applications .NET.  Il peut être utilisé pour consommer avec souplesse et simplicité les fonctionnalités exposées via HTTP. Vous pouvez utiliser HTTPClient pour mettre en œuvre des interactions avec une API Web en envoyant et en recevant des réponses à partir des verbes standards Get, Put, Post et Delete de HTTP grâce aux méthodes GetAsync, PutAsync, PostAsync, DeleteAsync.</p>
<p>L’exemple ci-dessous illustre comment vous pouvez consommer les données au format XML d’une API Web en utilisant la méthode GetAsync.</p>
<div>
<pre>HttpClient client = <span style="color: #0000ff">new</span> HttpClient();<br />client.DefaultRequestHeaders.Accept.Add(<span style="color: #0000ff">new</span> MediaTypeWithQualityHeaderValue(<span style="color: #006080">&quot;application/xml&quot;</span>));<br />var response = client.GetAsync(<span style="color: #006080">&quot;http://localhost:59130/api/Customer&quot;</span>).Result;<br /></pre>
<p></div>
<p>Si vous souhaitez que les données soient retournées au format XML, vous pouvez procéder comme suit :</p>
<div style="background-color: #f4f4f4;font-family: 'Courier New', Courier, Monospace;font-size: 8pt;line-height: 12pt;border: solid 1px silver;cursor: text;margin: 20px 0px 10px 0px;overflow: auto;padding: 4px;width: 97.5%;direction: ltr;text-align: left">
<pre style="background-color: #f4f4f4;font-family: 'Courier New', Courier, Monospace;font-size: 8pt;line-height: 12pt;border-style: none;color: black;overflow: visible;padding: 0px;width: 100%;margin: 0em;direction: ltr;text-align: left">HttpClient client = <span style="color: #0000ff">new</span> HttpClient();<br />client.DefaultRequestHeaders.Accept.Add(<span style="color: #0000ff">new</span> MediaTypeWithQualityHeaderValue(<span style="color: #006080">"application/json"</span>));<br />var response = client.GetAsync(<span style="color: #006080">"http://localhost:59130/api/Customer"</span>).Result;</pre>
<p></div>
<p>La procédure <strong>client.DefaultRequestHeaders.Accept.Add()</strong> permet de définir le format qui sera utilisé pour sérialiser les données.</p>
<p>La procédure asynchrone GetAsync() de la classe HttpClient() prend en paramètre une URI ou une chaine de caractères qui représente l’URL de l’API Web. GetAsync effectue une requête HTTP GET en utilisant l’URL passée en paramètre, puis retourne directement une tache dont la propriété Result (Task.Result) contient la réponse  HTTP (HttpResponseMessage). </p>
<p>NB : Il est recommandé lors de l’utilisation d’une méthode asynchrone d’utiliser également le mot clé await pour éviter que l’application ne soit bloquée jusqu’à ce que l’opération soit complète. On peut s’en passer pour une application console, mais pour une solution Desktop, faudra penser à utiliser await pour éviter le blocage de l’interface utilisateur. Pour plus de détails sur async et await, je vous invite à lire cet excellent article sur le sujet : les nouveautés de C# 5.0. </p>
<p>A titre d’exemple, vous allez créer une application console qui consomme l’API que vous avez créée ci-dessus. Cliquez sur le menu « FICHIER », sélectionnez « Ajouter » puis « Nouveau projet ». Sélectionnez le projet « Application Console » et donnez-lui le nom « TestFirstWebAPI ».</p>
<p>Après création du projet, vous allez ajouter une référence à HTTPClient. HTTPClient n’étant pas disponible par défaut dans le Framework .NET ou avec ASP.NET MVC 4, vous devez passer par le gestionnaire de packages NuGet pour ajouter cette dépendance à votre application.</p>
<p>Faites un clic droit sur votre projet dans l’explorateur de solution et sélectionnez la commande « Gérer les packages NuGet… ». Lorsque l’interface de NuGet va s’afficher, recherchez le package HTTPClient.</p>
<p><img src="http://rdonfack.developpez.com/tutoriels/dotnet/decouverte-asp-net-web-api/images/img7.png" alt="" /> </p>
<p>L’installation du package va  entrainer l’installation des dépendances System.Net.Http et System.Json que vous allez utiliser dans votre application.</p>
<p>Ajoutez une classe dans votre projet ayant la même définition que la classe Customer dans le projet ASP.NET MVC. Pour rappel, cette classe doit avoir la définition suivante :</p>
<div style="background-color: #f4f4f4;font-family: 'Courier New', Courier, Monospace;font-size: 8pt;line-height: 12pt;border: solid 1px silver;cursor: text;margin: 20px 0px 10px 0px;overflow: auto;padding: 4px;width: 97.5%;direction: ltr;text-align: left">
<pre style="background-color: #f4f4f4;font-family: 'Courier New', Courier, Monospace;font-size: 8pt;line-height: 12pt;border-style: none;color: black;overflow: visible;padding: 0px;width: 100%;margin: 0em;direction: ltr;text-align: left"><span style="color: #0000ff">public</span> <span style="color: #0000ff">class</span> Customer<br />    {<br />        <span style="color: #0000ff">public</span> <span style="color: #0000ff">int</span> Id { get; set; }<br />        <span style="color: #0000ff">public</span> <span style="color: #0000ff">string</span> FirstName { get; set; }<br />        <span style="color: #0000ff">public</span> <span style="color: #0000ff">string</span> LastName { get; set; }<br />        <span style="color: #0000ff">public</span> <span style="color: #0000ff">string</span> EMail { get; set; }<br />    }<br /></pre>
<p></div>
<p>Ajoutez par la suite une référence à System.Net.Http.Formatting  et System.Net.Http.Headers.</p>
<div style="background-color: #f4f4f4;font-family: 'Courier New', Courier, Monospace;font-size: 8pt;line-height: 12pt;border: solid 1px silver;cursor: text;margin: 20px 0px 10px 0px;overflow: auto;padding: 4px;width: 97.5%;direction: ltr;text-align: left">
<pre style="background-color: #f4f4f4;font-family: 'Courier New', Courier, Monospace;font-size: 8pt;line-height: 12pt;border-style: none;color: black;overflow: visible;padding: 0px;width: 100%;margin: 0em;direction: ltr;text-align: left"><span style="color: #0000ff">using</span> System.Net.Http.Formatting;<br /><span style="color: #0000ff">using</span> System.Net.Http.Headers;</pre>
<p></div>
<p>Vous allez maintenant ajouter les lignes de code suivantes à la fonction Main de votre application.</p>
<div>
<pre>HttpClient client = <span style="color: #0000ff">new</span> HttpClient();<br /><br /><br />client.DefaultRequestHeaders.Accept.Add(<br />     <span style="color: #0000ff">new</span> MediaTypeWithQualityHeaderValue(<span style="color: #006080">&quot;application/json&quot;</span>));<br /><br /> var response = client.GetAsync(<span style="color: #006080">&quot;http://localhost:59130/api/customer&quot;</span>).Result;  <br /><br /> <span style="color: #0000ff">if</span> (response.IsSuccessStatusCode)<br /> {<br />     <br />     var Customers = response.Content.ReadAsAsync&lt;IEnumerable&lt;Customer&gt;&gt;().Result;<br />     <span style="color: #0000ff">foreach</span> (var c <span style="color: #0000ff">in</span> Customers)<br />     {<br />         Console.WriteLine(<span style="color: #006080">&quot;{0}\t{1}\t{2}&quot;</span>, c.FirstName, c.LastName, c.EMail);<br />        <br />     }<br /> }<br /> <span style="color: #0000ff">else</span><br /> {<br />     Console.WriteLine(<span style="color: #006080">&quot;{0} ({1})&quot;</span>, (<span style="color: #0000ff">int</span>)response.StatusCode, response.ReasonPhrase);<br /> }<br />     Console.ReadLine();<br /></pre>
<p></div>
<p>La procédure ReadAsAsync() lit et déserialise automatiquement le corps de la réponse HTTP qui contient la liste des clients.  </p>
<p>En appuyant sur F5 pour lancer le débogage de votre application, vous allez obtenir le résultat suivant :</p>
<p><img src="http://rdonfack.developpez.com/tutoriels/dotnet/decouverte-asp-net-web-api/images/img8.png" alt="" /> </p>
<p>Rassurez vous que vous utilisez un numéro de port spécifique pour votre application (59130 pour mon cas). Vous pouvez vérifier cela dans les propriétés du projet, onglet Web :</p>
<p><img src="http://rdonfack.developpez.com/tutoriels/dotnet/decouverte-asp-net-web-api/images/img9.png" alt="" /></p>
<p>Vous avez le choix entre utiliser un numéro de port spécifique ou utiliser le serveur Web IIS local si vous en avez. Dans ces cas, le numéro de port ne varie que si vous décidez de le modifier.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ASP.NET MVC : optimiser le temps de chargement des pages en utilisant le regroupement et la minification</title>
		<link>https://blog.developpez.com/lilroma/p11258/net/asp_net_mvc_optimiser_le_temps_de_charge_1</link>
		<comments>https://blog.developpez.com/lilroma/p11258/net/asp_net_mvc_optimiser_le_temps_de_charge_1#comments</comments>
		<pubDate>Tue, 28 Aug 2012 14:38:19 +0000</pubDate>
		<dc:creator><![CDATA[Hinault Romaric]]></dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[ASP.NET MVC 4]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Bonjour, Un petit message pour annoncer la publication de mon nouvel article sur le regroupement et la minification du JavaScript et CSS, des techniques d&#8217;optimisation qu&#8217;apporte ASP.NET MVC 4, pouvant grandement influencer le temps de chargement des pages Web. Le &#8230; <a href="https://blog.developpez.com/lilroma/p11258/net/asp_net_mvc_optimiser_le_temps_de_charge_1">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Bonjour,</p>
<p>Un petit message pour annoncer la publication de mon nouvel article sur le regroupement et la minification du JavaScript et CSS, des techniques d&rsquo;optimisation qu&rsquo;apporte ASP.NET MVC 4, pouvant grandement influencer le temps de chargement des pages Web.</p>
<blockquote><p>
Le temps de chargement d&rsquo;une page est un facteur important dans l&rsquo;évaluation des performances d&rsquo;un site Web. Il a un impact non négligeable sur l&rsquo;expérience utilisateur et même sur le référencement naturel. Plus les pages de votre site se chargent rapidement, plus l&rsquo;expérience de navigation est fluide et plus les utilisateurs sont contents.</p>
<p>Dans nos applications, nous avons recours à plusieurs bibliothèques dont jQuery, knockout, etc. et des feuilles de styles qui ont des conséquences non négligeables sur le temps de chargement des pages.</p>
<p>Dans cet article, nous verrons comment améliorer les performances d&rsquo;une application Web ASP.NET MVC en utilisant le regroupement et la minification à la volée du CSS et JavaScript.</p>
</blockquote>
<p><img src="http://www.developpez.net/forums/images/smilies/fleche.gif" alt="" title="" /> L&rsquo;article complet peut-être consulté sur <a href="http://rdonfack.developpez.com/tutoriels/dotnet/asp-net-mvc-optimiser-temps-chargement-page-utilisant-regroupement-et-minification/">cette page</a>.</p>
<p><img src="http://www.developpez.net/forums/images/smilies/fleche.gif" alt="" title="" /> Pour les commentaires, <a href="http://www.developpez.net/forums/d1255425/dotnet/developpement-web-net/asp-net-mvc/asp-net-mvc-optimiser-temps-chargement-pages-utilisant-regroupement-minification/">ça se passe ici</a>.</p>
<p><img src="http://www.developpez.net/forums/images/smilies/fleche.gif" alt="" title="" /> <a href="http://rdonfack.developpez.com/tutoriels/dotnet/asp-net-mvc-optimiser-temps-chargement-page-utilisant-regroupement-et-minification/bundling.zip">Télécharger le ZIP de l&rsquo;article.</a></p>
<p><img src="http://www.developpez.net/forums/images/smilies/fleche.gif" alt="" title="" /> <a href="http://rdonfack.developpez.com/tutoriels/dotnet/asp-net-mvc-optimiser-temps-chargement-page-utilisant-regroupement-et-minification/bundling.pdf">Télécharger l&rsquo;article au format PDF.</a></p>
<p><img src="http://www.developpez.net/forums/images/smilies/fleche.gif" alt="" title="" /> <a href="http://rdonfack.developpez.com/tutoriels/dotnet/asp-net-mvc-optimiser-temps-chargement-page-utilisant-regroupement-et-minification/bundling-ebooks.zip">Télécharger l&rsquo;article au format eBooks.</a></p>
<p>Bonne lecture <img src="https://blog.developpez.com/lilroma/wp-includes/images/smilies/icon_wink.gif" alt=";)" class="wp-smiley" /></p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>21</slash:comments>
		</item>
		<item>
		<title>Optimisation du temps de chargement d’une page ASP.NET MVC Part 2 : La mise en cache</title>
		<link>https://blog.developpez.com/lilroma/p11207/net/optimisation_du_temps_de_chargement_d_un</link>
		<comments>https://blog.developpez.com/lilroma/p11207/net/optimisation_du_temps_de_chargement_d_un#comments</comments>
		<pubDate>Wed, 08 Aug 2012 10:01:09 +0000</pubDate>
		<dc:creator><![CDATA[Hinault Romaric]]></dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[ASP.NET MVC 3]]></category>
		<category><![CDATA[ASP.NET MVC 4]]></category>
		<category><![CDATA[C#]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Pour améliorer les performances de leur application, les développeurs ont couramment recours à l’optimisation côté client et côté serveur. L’optimisation d’une application Web regroupe l’ensemble des techniques qui peuvent aider à accélérer le temps de téléchargement d’une page Web. Parmi &#8230; <a href="https://blog.developpez.com/lilroma/p11207/net/optimisation_du_temps_de_chargement_d_un">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Pour améliorer les performances de leur application, les développeurs ont couramment recours à l’optimisation côté client et côté serveur. L’optimisation d’une application Web regroupe l’ensemble des techniques qui peuvent aider à accélérer le temps de téléchargement d’une page Web. Parmi ces techniques, on retrouve la minification et la compression du CSS et JavaScript, la mise en cache, l’utilisation des CDN, etc.</p>
<p>Ce billet est le second d’une série sur les techniques d’optimisation du temps de chargement d’une application ASP.NET MVC. Le premier article sur la compression et la minification du CSS et JavaScript peut être consulté sur <a href="http://blog.developpez.com/lilroma/p10462/net/asp-net/microsoft-web-optimisation-ou-comment-op/">cette page</a>.</p>
<p><span id="more-44"></span></p>
<p>Les requêtes des utilisateurs sur une page d’un site Web qu’il soit statistique ou dynamique engendre couramment le chargement de plusieurs éléments et de nombreuses opérations (chargement des images, CSS, JavaScript, données depuis une en base de données, etc.). Imaginez un intervalle de temps pendant lequel près de 100 requêtes sont effectuées sur votre site, et que durant cette période, le même contenu est retourné par votre application. Tout le long ce moment, votre application reprend 100 fois les mêmes opérations pour retourner un contenu identique.</p>
<p>La mis en cache est un procédé permettant d’améliorer considérablement le temps de chargement d’une page Web et économiser la bande passante, en évitant d’exécuter plusieurs fois certaines opérations (chargement des données, lecture d’une information dans la base de données, etc.) en stockant le contenu de cette page quelque part.</p>
<p><strong>Activer la mise en cache</strong></p>
<p>Le Framework ASP.NE MVC depuis la version 1 dispose d’un mécanisme pour la mise en a cache d’une application, qui repose essentiellement sur la même technique utilisée par ASP.NET. Il a été amélioré à partir de la version 3 pour coller avec les spécificités de la plateforme.</p>
<p>L’activation de la mise en cache se fait via l’attribut <strong>[OutputCache]</strong> qui peut être ajoutée soit individuellement à une action contrôleur, ou alors à une classe entière d&rsquo;un contrôleur</p>
<p>Le code ci-dessous permet de mettre en cache pendant 30 secondes la sortie de l’action Index.</p>
<div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper">
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px" id="codeSnippet">[OutputCache(Duration = 30)] <span style="color: #008000">//mise en cache pour 30 secondes</span><br /><span style="color: #0000ff">public</span> ActionResult Index()<br />{<br />    ViewBag.Message = <span style="color: #006080">&quot;Cette page a été mise e cache à &quot;</span> + DateTime.Now;<br /><br />    <span style="color: #0000ff">return</span> View();<br />}<br /><br /></pre>
<p></div>
<p>Pour mettre en  cache une classe entière d’un contrôleur, il suffit de décorer la classe avec l’attribut OutputCache comme l’illustre le code ci-dessous :</p>
<div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; max-height: 400px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper">
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px" id="codeSnippet">[OutputCache(Duration = 30)] <span style="color: #008000">//mise en cache pour 30 secondes</span><br />    <span style="color: #0000ff">public</span> <span style="color: #0000ff">class</span> HomeController : Controller<br />    {<br />       <br />        <span style="color: #0000ff">public</span> ActionResult Index()<br />        {<br />            ViewBag.Message = <span style="color: #006080">&quot;Cette page a été mise e cache à &quot;</span> + DateTime.Now;<br /><br />            <span style="color: #0000ff">return</span> View();<br />        }<br /><br />        <span style="color: #0000ff">public</span> ActionResult About()<br />        {<br />            ViewBag.Message = <span style="color: #006080">&quot;Your app description page.&quot;</span>;<br /><br />            <span style="color: #0000ff">return</span> View();<br />        }<br />}<br /></pre>
<p></div>
<p>Si vous exécutez ce code, vous vous rendrez compte que la date et l’heure affichées ne vont pas varier chaque fois que vous allez actualiser la page, jusqu’à ce que les 30 secondes soient écoulées.</p>
<p>NB: Il faut noter que le temps de sauvegarde des données de la page n’est pas garanti. En cas de manque de ressources mémoires, le cache va commencer à vider automatiquement son contenu.</p>
<p><strong>Personnaliser la mise en cache</strong></p>
<p>En dehors de la propriété Duration qui permet de définir le temps de mise en cache, d’autres propriétés dont il est important de connaitre sont disponibles pour vous permettre de personnaliser la mise en cache des données de votre page selon votre convenance et les spécificités de la page.</p>
<p><strong>Location</strong></p>
<p>La propriété location permet de définir l’emplacement pour enregistrer l’objet mis en cache. Il est possible d’enregistre l’objet mis en  cache sur le serveur, le client, les deux ou toutes les autres options de l’enum <strong>OutputCacheLocation</strong>. Les différentes valeurs qu’elle peut prendre sont :</p>
<p>&#8211; Any<br />
&#8211; Client<br />
&#8211; Downstream<br />
&#8211; Server<br />
&#8211; None<br />
&#8211; ServerAndClient </p>
<p>Par défaut, la valeur Any est utilisée lorsque cette propriété n’est pas spécifiée. L’orientation vers la mise en cache côté client, côté serveur ou les deux doit se faire suivant vos besoins. Si vous souhaitez afficher par exemple des informations personnalisées à l’utilisation comme son heure de connexion, son login, ses statistiques, etc. vous devez utiliser dans ce cas la mise en cache côté client.</p>
<p>Le code ci-dessous permet de mettre en cache la méthode d’action Index uniquement chez le client.</p>
<div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper">
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px" id="codeSnippet">[OutputCache(Duration = 10, Location = OutputCacheLocation.Client)]<br /> <span style="color: #0000ff">public</span> ActionResult Index()<br /> {<br />     ViewBag.Message = <span style="color: #006080">&quot;Cette page a été mise en cache à &quot;</span> + DateTime.Now;<br /><br />     <span style="color: #0000ff">return</span> View();<br /> }<br /></pre>
<p></div>
<p><strong>VaryByParam</strong></p>
<p>Supposons un instant que vous voulez afficher les détails sur un produit à partir de son identifiant. Cela suppose qu’à chaque fois que l’identifiant du produit va changer, les détails affichés doivent également changer. Comment modifier la mise en cache pour que le contenu change automatiquement lorsque l’ID change. C’est à ce stade qu’intervient la propriété VaryByParam.  Cette propriété permet de créer différentes versions d&rsquo;un même contenu, dès que l&rsquo;un des paramètres du formulaire ou de l&rsquo;URL change. </p>
<p>Le code ci-dessous illustre comment vous pouvez l’utiliser.</p>
<div id="codeSnippetWrapper" style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border: solid 1px silver; cursor: text; margin: 20px 0px 10px 0px; max-height: 200px; overflow: auto; padding: 4px; width: 97.5%; direction: ltr; text-align: left;">
<pre id="codeSnippet" style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border-style: none; color: black; overflow: visible; padding: 0px; width: 100%; margin: 0em; direction: ltr; text-align: left;">[OutputCache(Duration = 3600, VaryByParam=<span style="color: #006080;">"id"</span>)]<br />        <span style="color: #0000ff;">public</span> ViewResult Details(<span style="color: #0000ff;">short</span> id)<br />        {<br />            Articles article = db.Articles.Find(id);<br />            <span style="color: #0000ff;">return</span> View(article);<br />        }</pre>
<p></div>
<p>En procédant ainsi, plusieurs versions du contenu de la méthode d’action sont mises en cache jusqu’à expiration de la période de mise en cache.</p>
<p><strong>Créer un profil de cache dans le Web.Config</strong></p>
<p>Le fichier de configuration de votre application peut être utilisé pour créer un profil un cache. L’utilisation de cette technique présente plusieurs avantages :</p>
<p>&#8211; vous pouvez créer un profil de cache et appliquer celui-ci à plusieurs actions ou contrôleurs.</p>
<p>&#8211; vous pouvez modifier le comportement de votre profil de cache dans le Web.config sans avoir besoin de recompiler votre application.</p>
<p>Par exemple, la section de configuration Web « caching » définit un profil de cache nommé MyCacheProfil. Cette section « caching » doit apparaître dans la section « system.web » du fichier Web.Config.</p>
<div id="codeSnippetWrapper" style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border: solid 1px silver; cursor: text; margin: 20px 0px 10px 0px; max-height: 200px; overflow: auto; padding: 4px; width: 97.5%; direction: ltr; text-align: left;">
<pre id="codeSnippet" style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border-style: none; color: black; overflow: visible; padding: 0px; width: 100%; margin: 0em; direction: ltr; text-align: left;">&lt;system.web&gt;<br />    &lt;caching&gt;<br />      &lt;outputCacheSettings&gt;<br />        &lt;outputCacheProfiles&gt;<br />          &lt;add name=<span style="color: #006080;">"MyCacheProfile"</span>  duration=<span style="color: #006080;">"60"</span> /&gt;<br />        &lt;/outputCacheProfiles&gt;<br />      &lt;/outputCacheSettings&gt;<br />    &lt;/caching&gt;<br />  &lt;/system.web&gt;</pre>
<p></div>
<p>Le contrôleur suivant illustre comment appliquer le profil MyCacheProfile sur une action contrôleur à l&rsquo;aide de l&rsquo;attribut [OutputCache].</p>
<div id="codeSnippetWrapper" style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border: solid 1px silver; cursor: text; margin: 20px 0px 10px 0px; max-height: 200px; overflow: auto; padding: 4px; width: 97.5%; direction: ltr; text-align: left;">
<pre id="codeSnippet" style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border-style: none; color: black; overflow: visible; padding: 0px; width: 100%; margin: 0em; direction: ltr; text-align: left;">[OutputCache(CacheProfile=<span style="color: #006080;">"MyCacheProfile"</span>)]<br />        <span style="color: #0000ff;">public</span> ActionResult Index()<br />        {<br />            ViewBag.Message = <span style="color: #006080;">"Cette page a été mise en cache à "</span> + DateTime.Now;<br /><br />            <span style="color: #0000ff;">return</span> View();<br />        }</pre>
<p></div>
<p>Le cache de sortie fournir un moyen simple pour améliorer radicalement les performances de vos applications ASP.Net MVC. Au travers de cet article, vous avez découvert comment vous pouvez utiliser cette technique. Restez connecté à mon blog pour la suite des astuces sur l’optimisation du temps de chargement d’une page Web.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>[Article]Entity Framework : à la découverte de Code First Migrations</title>
		<link>https://blog.developpez.com/lilroma/p11158/net/article_entity_framework_a_la_decouverte</link>
		<comments>https://blog.developpez.com/lilroma/p11158/net/article_entity_framework_a_la_decouverte#comments</comments>
		<pubDate>Wed, 18 Jul 2012 09:30:59 +0000</pubDate>
		<dc:creator><![CDATA[Hinault Romaric]]></dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[ASP.NET MVC 4]]></category>
		<category><![CDATA[Entity Framework]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Un petit post pour annoncé la publication de nouvel article sur Code First Migrations, la nouveauté certainement la plus intéressante d&#8217;Entity Framework 4.3. Pendant le développement ou le cycle de vie d&#8217;une application, le développeur est très souvent confronté à &#8230; <a href="https://blog.developpez.com/lilroma/p11158/net/article_entity_framework_a_la_decouverte">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Un petit post pour annoncé la publication de nouvel article sur Code First Migrations, la nouveauté certainement la plus intéressante d&rsquo;Entity Framework 4.3.</p>
<blockquote><p>Pendant le développement ou le cycle de vie d&rsquo;une application, le développeur est très souvent confronté à des situations pouvant entrainer des modifications de son modèle objet ainsi que de sa base de données. Avec Entity Framework, cette tâche peut s&rsquo;avérer assez complexe, voire frustrante pour certains.</p>
<p>Si vous voulez par exemple apporter une modification (ajout d&rsquo;une colonne) à une table de votre base de données, si vous vous limitez à définir uniquement la nouvelle colonne dans votre modèle, lors de l&rsquo;exécution de l&rsquo;application vous allez obtenir un message d&rsquo;erreur puisque le modèle ne correspond plus aux objets de la BD.</p>
<p>Il était cependant possible d&rsquo;ajouter quelques lignes de code dans le fichier Global.asax, permettant lors de la modification du modèle, de détruire et recréer automatiquement la base de données lors de la prochaine exécution de l&rsquo;application, avec comme conséquence directe la perte des données. Ce qui est inacceptable pour une base de données déjà en production.</p>
<p>Heureusement, Entity Framework 4.3 élimine ces contraintes avec la nouvelle fonctionnalité Code First Migrations, qui permet d&rsquo;appliquer avec souplesse les modifications du modèle sur la base de données, en réduisant les risques de pertes de données.</p></blockquote>
<p>L&rsquo;article complet est <a href="http://rdonfack.developpez.com/tutoriels/dotnet/entity-framework-decouverte-code-first-migrations/">disponible ici</a>.</p>
<p>Pour les commentaires, <a href="http://www.developpez.net/forums/d1243827/dotnet/acces-aux-donnees/entity-framework/entity-framework-decouverte-code-first-migrations/">ça se passe ici</a></p>
<p><strong>Bonne lecture</strong> <img src="https://blog.developpez.com/lilroma/wp-includes/images/smilies/icon_wink.gif" alt=";)" class="wp-smiley" /></p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Entity Framework Code First : activer la migration automatique</title>
		<link>https://blog.developpez.com/lilroma/p11097/net/entity_framework_code_first_activer_la_m</link>
		<comments>https://blog.developpez.com/lilroma/p11097/net/entity_framework_code_first_activer_la_m#comments</comments>
		<pubDate>Sat, 16 Jun 2012 10:35:58 +0000</pubDate>
		<dc:creator><![CDATA[Hinault Romaric]]></dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[ASP.NET MVC 3]]></category>
		<category><![CDATA[ASP.NET MVC 4]]></category>
		<category><![CDATA[Entity Framework]]></category>
		<category><![CDATA[SGBD]]></category>
		<category><![CDATA[Visual Studio]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Pendant le développement ou le cycle de vie d’une application, le développeur est très souvent confronté à des situations pouvant entrainer des modifications de son modèle objet et de la base de données. Avec Entity Framework, cette tâche peut s’avérer &#8230; <a href="https://blog.developpez.com/lilroma/p11097/net/entity_framework_code_first_activer_la_m">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Pendant le développement ou le cycle de vie d’une application, le développeur est très souvent confronté à des situations pouvant entrainer des modifications de son modèle objet et de la base de données. Avec Entity Framework, cette tâche peut s’avérer assez complexe et voir même frustrant pour certains.</p>
<p>Une des nouveautés les plus intéressantes qu’apporte Entity Framework 4.3 est la migration pour les mises à jour de la base de données.</p>
<p>Cette fonctionnalité offre aux développeurs des outils permettant d’appliquer avec souplesse et facilité des mises à jour à la base de données à partir des modifications apportées à l’application. </p>
<p><span id="more-80"></span></p>
<p>Dans <a href="http://blog.developpez.com/lilroma/p10807/">un précédent billet de blog</a>, j’ai présenté cette fonctionnalité et comment l’on pouvait l’utiliser pour effectuer des mises à jour de la base de données.</p>
<p>Cet article présentait uniquement l’un des modes de mises à jour qu’offre Entity Framework : le mode basé sur le code.</p>
<p>Supposons que vous disposez déjà d’une application utilisant Entity Framework Code First. Procédez à la mise à jour de celle-ci pour utiliser la version 4.3 d’Entity Framework si ce n’est pas encore le cas.</p>
<p>Vous pouvez utiliser la commande :</p>
<blockquote><p>PM>  install-package EntityFramework
</p></blockquote>
<p><strong>Activer la migration</strong></p>
<p>La première étape est d’activer la migration pour votre DbContext, en utilisant la console du gestionnaire de packages (menu Outils/Gestionnaire de package/Package Manager Console de Visual Studio). Vous allez exécuter la commande «  Enabled-Migrations ».</p>
<p><img src="http://blog.developpez.com/media/enablemigration.png" alt="" title="" /></p>
<p>L’activation de la migration crée un nouveau dossier Migrations dans votre application contenant un fichier Configurations.cs permettant de définir le comportement de la migration pour le DbContext qui est utilisé.</p>
<div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; max-height: 200px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper">
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px" id="codeSnippet"><span style="color: #0000ff">namespace</span> DatabaseMigration.Migrations<br />{<br />    <span style="color: #0000ff">using</span> System;<br />    <span style="color: #0000ff">using</span> System.Data.Entity;<br />    <span style="color: #0000ff">using</span> System.Data.Entity.Migrations;<br />    <span style="color: #0000ff">using</span> System.Linq;<br /><br />    <span style="color: #0000ff">internal</span> <span style="color: #0000ff">sealed</span> <span style="color: #0000ff">class</span> Configuration : DbMigrationsConfiguration&lt;DatabaseMigration.DatabaseMigrationContext&gt;<br />    {<br />        <span style="color: #0000ff">public</span> Configuration()<br />        {<br />            AutomaticMigrationsEnabled = <span style="color: #0000ff">false</span>;<br />        }<br /><br />        <span style="color: #0000ff">protected</span> <span style="color: #0000ff">override</span> <span style="color: #0000ff">void</span> Seed(DatabaseMigration.DatabaseMigrationContext context)<br />        {<br />            <br />        }<br />    }<br />}<br /></pre>
<p></div>
<p>Si vous avez défini plusieurs «DbContext » dans votre application, il suffira juste de modifier  DbMigrationsConfiguration(T), en remplaçant T par le nom du DbContext que vous voulez utiliser.</p>
<p><strong>Configurer la migration automatique</strong></p>
<p>Par défaut, la propriété AutomaticMigrationsEnabled est définie à false. Pour utiliser la migration automatique, vous devez affecter la valeur « true » à cette propriété.</p>
<p>Il également possible de définir cette propriété à true lors de l’activation de la migration. Pour cela, vous devez ajouter le paramètre EnableAutomaticMigrations à la commande permettant d’activer la migration :</p>
<blockquote><p>PM> Enable-Migrations -EnableAutomaticMigrations</p></blockquote>
<p>Par défaut, la migration automatique n’autorise pas les mises à jour pouvant entrainer des pertes de données. Pour activer cette option, vous devez éditer le fichier Configuration.cs en y ajoutant la propriété  « AutomaticMigrationDataLossAllowed » qui sera définie à true.</p>
<div id="codeSnippetWrapper" style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border: solid 1px silver; cursor: text; margin: 20px 0px 10px 0px; max-height: 200px; overflow: auto; padding: 4px; width: 97.5%; direction: ltr; text-align: left;">
<pre id="codeSnippet" style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border-style: none; color: black; overflow: visible; padding: 0px; width: 100%; margin: 0em; direction: ltr; text-align: left;"><span style="color: #0000ff;">public</span> Configuration()<br />        {<br />            AutomaticMigrationsEnabled = <span style="color: #0000ff;">true</span>;<br />            AutomaticMigrationDataLossAllowed = <span style="color: #0000ff;">true</span>;<br />        }</pre>
<p></div>
<p>Editez ensuite votre DbContext et ajoutez-y la procédure onModelCreating  :</p>
<div id="codeSnippetWrapper" style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border: solid 1px silver; cursor: text; margin: 20px 0px 10px 0px; max-height: 200px; overflow: auto; padding: 4px; width: 97.5%; direction: ltr; text-align: left;">
<pre id="codeSnippet" style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border-style: none; color: black; overflow: visible; padding: 0px; width: 100%; margin: 0em; direction: ltr; text-align: left;"><span style="color: #0000ff;">protected</span> <span style="color: #0000ff;">override</span> <span style="color: #0000ff;">void</span> OnModelCreating(DbModelBuilder modelBuilder)<br />        {<br />            Database.SetInitializer(<span style="color: #0000ff;">new</span> MigrateDatabaseToLatestVersion&lt;DatabaseMigrationContext, Configuration&gt;());<br />        }</pre>
<p></div>
<p>Et voilà, c’est tout ;). Toute modification de votre modèle objet (nouvelle entité, ajout d’une propriété, suppression d’une propriété, etc.) sera automatiquement appliquée à la base de données à l’exécution de votre application.</p>
<p><strong>Inconvénients de la migration automatique</strong></p>
<p>La migration automatique permet d’apporter assez rapidement et simplement des mises à jour à une base de données en utilisant Entity Framework Code First. Cette option présente cependant des inconvénients, et personnellement, je ne recommanderais pas son utilise en environnement de production ou sur un système critique.</p>
<p>L’utilisation du mode automatique en environnement de production peut s’avérer assez dangereuse, avec un risque de perte de données, car les modifications apportées à la base de données sont imprévisibles par le développeur, et celui-ci n’a aucune visibilité sur ces changements.</p>
<p>Néanmoins, vous pouvez limiter ces risques en environnement de production en désactivant l’autorisation des mises à jour pouvant entrainer des pertes de données.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Utiliser WebAPI dans une application ASP.NET WebForms</title>
		<link>https://blog.developpez.com/lilroma/p11050/net/utiliser_webapi_dans_une_application_asp</link>
		<comments>https://blog.developpez.com/lilroma/p11050/net/utiliser_webapi_dans_une_application_asp#comments</comments>
		<pubDate>Mon, 28 May 2012 10:18:54 +0000</pubDate>
		<dc:creator><![CDATA[Hinault Romaric]]></dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[ASP.NET Web API]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[La bêta d’ASP.NET MVC 4 avait été expédiée avec WebAPI, un cadre permettant aux développeurs d’exposer leurs applications, données et services sur le Web directement à travers HTTP. Dans mon précédent billet de blog sur WebAPI, j’ai décrit comment utiliser &#8230; <a href="https://blog.developpez.com/lilroma/p11050/net/utiliser_webapi_dans_une_application_asp">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>La bêta d’ASP.NET MVC 4 avait été expédiée avec WebAPI, un cadre permettant aux développeurs d’exposer leurs applications, données et services sur le Web directement à travers HTTP.</p>
<p>Dans <a href="http://blog.developpez.com/lilroma/p10807/">mon précédent billet de blog</a> sur WebAPI, j’ai décrit comment utiliser WebAPi dans une application ASP.NET MVC. Mais, il est également possible de l’utiliser dans une application ASP.NET WebForms.</p>
<p><span id="more-78"></span></p>
<p>Je vais montrer dans cet article comment utiliser simplement WebAPI dans une application ASP.NET. Dès lors que vous avez installé ASP.NET MVC 4 beta, vous pouvez dans n’importe quel projet (Application Web, Site Web) ajouter un contrôleur WebAPI. Celui-ci va automatiquement intégrer dans votre solution toutes les références nécessaires pour WebAPI.</p>
<p>Pour illustrer cela, vous allez créer une nouvelle application Web ASP.NET. Vous devez au préalable avoir installé ASP.NET MVC 4 beta.</p>
<p><img src="http://blog.developpez.com/media/createaspapp.png" width="704" height="583" alt="" /></p>
<p>Dans l’application, vous allez ajouter un dossier App_Code. Ensuite, vous allez créer la classe Web API Controller dans ce dossier en faisant un clic droit sur celui-ci, puis en sélectionnant Add, et ensuite New Item :</p>
<p><img src="http://blog.developpez.com/media/appexplorer.png" width="688" height="424" alt="" /> </p>
<p>Dans la fenêtre de sélection du Template, vous verrez un nouveau Template « Web API Controller Class ».  Sélectionnez celui-ci, et renommez le fichier en vous assurant que le nom s’achève par « Controller ».  Puis cliquez sur « Add » :</p>
<p><img src="http://blog.developpez.com/media/appcontroller.png" width="668" height="537" alt="" /> </p>
<p>Un nouveau contrôleur Web API qui hérite de ApiController sera créé dans le dossier App_code avec des lignes de code par défaut illustrant comment vous pouvez créer des requêtes Get(), Post(), Put() et Delete() pour votre API.</p>
<div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; max-height: 800px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper">
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet"><span style="color: #0000ff">using</span> System;<br /><span style="color: #0000ff">using</span> System.Collections.Generic;<br /><span style="color: #0000ff">using</span> System.Linq;<br /><span style="color: #0000ff">using</span> System.Net.Http;<br /><span style="color: #0000ff">using</span> System.Web.Http;<br /><br /><span style="color: #0000ff">namespace</span> WebApplication1.App_Code.Controllers<br />{<br />    <span style="color: #0000ff">public</span> <span style="color: #0000ff">class</span> ValuesController : ApiController<br />    {<br />        <span style="color: #008000">// GET /api/&lt;controller&gt;</span><br />        <span style="color: #0000ff">public</span> IEnumerable&lt;<span style="color: #0000ff">string</span>&gt; Get()<br />        {<br />            <span style="color: #0000ff">return</span> <span style="color: #0000ff">new</span> <span style="color: #0000ff">string</span>[] { <span style="color: #006080">&quot;value1&quot;</span>, <span style="color: #006080">&quot;value2&quot;</span> };<br />        }<br /><br />        <span style="color: #008000">// GET /api/&lt;controller&gt;/5</span><br />        <span style="color: #0000ff">public</span> <span style="color: #0000ff">string</span> Get(<span style="color: #0000ff">int</span> id)<br />        {<br />            <span style="color: #0000ff">return</span> <span style="color: #006080">&quot;value&quot;</span>;<br />        }<br /><br />        <span style="color: #008000">// POST /api/&lt;controller&gt;</span><br />        <span style="color: #0000ff">public</span> <span style="color: #0000ff">void</span> Post(<span style="color: #0000ff">string</span> <span style="color: #0000ff">value</span>)<br />        {<br />        }<br /><br />        <span style="color: #008000">// PUT /api/&lt;controller&gt;/5</span><br />        <span style="color: #0000ff">public</span> <span style="color: #0000ff">void</span> Put(<span style="color: #0000ff">int</span> id, <span style="color: #0000ff">string</span> <span style="color: #0000ff">value</span>)<br />        {<br />        }<br /><br />        <span style="color: #008000">// DELETE /api/&lt;controller&gt;/5</span><br />        <span style="color: #0000ff">public</span> <span style="color: #0000ff">void</span> Delete(<span style="color: #0000ff">int</span> id)<br />        {<br />        }<br />    }<br />}</pre>
<p></div>
<p>Pour ce billet,  on se limitera uniquement à l’utilisation du code généré. </p>
<p><strong>Exposer les fonctionnalités de l’API</strong></p>
<p>Vous allez maintenant définir une route pour WebAPI afin de pouvoir exposer les fonctionnalités de votre API.</p>
<p>Pour cela, vous allez ajouter les lignes de suivantes dans la méthode Application-Start du fichier Global.ascx.cs.</p>
<div id="codeSnippetWrapper" style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border: solid 1px silver; cursor: text; margin: 20px 0px 10px 0px; max-height: 200px; overflow: auto; padding: 4px; width: 97.5%; direction: ltr; text-align: left;">
<pre id="codeSnippet" style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border-style: none; color: black; overflow: visible; padding: 0px; width: 100%; margin: 0em; direction: ltr; text-align: left;"><span style="color: #0000ff;">void</span> Application_Start(<span style="color: #0000ff;">object</span> sender, EventArgs e)<br />        {<br />            <span style="color: #008000;">// Code that runs on application startup</span><br />            RouteTable.Routes.MapHttpRoute(<br />            name: <span style="color: #006080;">"DefaultApi"</span>,<br />              routeTemplate: <span style="color: #006080;">"api/{controller}/{id}"</span>,<br />              defaults: <span style="color: #0000ff;">new</span> { id = System.Web.Http.RouteParameter.Optional }<br />          );<br /><br />        }</pre>
<p></div>
<p>Vous devez également ajouter une référence à System.Web.Routing et System.Web.Http</p>
<p><img src="http://blog.developpez.com/media/appaddreference.png" width="698" height="275" alt="" /></p>
<p><strong>Consommer l’API</strong></p>
<p>Voyons maintenant comment vous pouvez consommer L’API créée.  Il est possible d&rsquo;appeler votre service en utilisant JavaScript, Ajax ou HttpClient.</p>
<p>Le script ci-dessous permet d’appeler le verbe Get pour lire les données en utilisant JavaScript.</p>
<div style="border-bottom: silver 1px solid; text-align: left; border-left: silver 1px solid; padding-bottom: 4px; line-height: 12pt; background-color: #f4f4f4; margin: 20px 0px 10px; padding-left: 4px; width: 97.5%; padding-right: 4px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; max-height: 500px; font-size: 8pt; overflow: auto; border-top: silver 1px solid; cursor: text; border-right: silver 1px solid; padding-top: 4px" id="codeSnippetWrapper">
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; border-right-style: none; background-color: #f4f4f4; margin: 0em; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; font-size: 8pt; border-left-style: none; overflow: visible; padding-top: 0px" id="codeSnippet">&lt;script type=<span style="color: #006080">&quot;text/javascript&quot;</span>&gt;<br />    $(document).ready(<span style="color: #0000ff">function</span> () {<br />        <span style="color: #008000">// Envoi de la requête Ajax</span><br />          $.getJSON(<span style="color: #006080">&quot;api/values/&quot;</span>,<br />             <span style="color: #0000ff">function</span> (data) {<br />                <span style="color: #008000">// En cas de succès, 'data' contient la liste des clients.</span><br />                   $.each(data, <span style="color: #0000ff">function</span> (key, val) {<br />                    <span style="color: #0000ff">var</span> str = val;<br />                    $(<span style="color: #006080">'&lt;li/&gt;'</span>, { html: str }).appendTo($(<span style="color: #006080">'#getvalues'</span>));<br />                });<br />            });<br />    });<br />&lt;/script&gt;</pre>
<p></div>
<p>Les lignes ci-dessous seront utilisées pour afficher les informations retournées.   </p>
<div id="codeSnippetWrapper" style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border: solid 1px silver; cursor: text; margin: 20px 0px 10px 0px; max-height: 200px; overflow: auto; padding: 4px; width: 97.5%; direction: ltr; text-align: left;">
<pre id="codeSnippet" style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border-style: none; color: black; overflow: visible; padding: 0px; width: 100%; margin: 0em; direction: ltr; text-align: left;">&lt;h1&gt;GET VALUES&lt;/h1&gt;<br />&lt;ul id=<span style="color: #006080;">'getvalues'</span> /&gt;<br /></pre>
<p></div>
<p>A l’exécution, vous allez obtenir le résultat suivant :</p>
<p>Nb : Si vous ne disposez pas d’ASP.NET MVC 4 beta, vous pouvez télécharger et installer séparément le package ASP.NET Web API via le gestionnaire de packages NuGet.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ASP.NET MVC 4 : utilisation de Code First Migrations</title>
		<link>https://blog.developpez.com/lilroma/p10807/net/asp_net_mvc_4_utilisation_de_code_first_</link>
		<comments>https://blog.developpez.com/lilroma/p10807/net/asp_net_mvc_4_utilisation_de_code_first_#comments</comments>
		<pubDate>Fri, 09 Mar 2012 09:59:30 +0000</pubDate>
		<dc:creator><![CDATA[Hinault Romaric]]></dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[ASP.NET MVC 4]]></category>
		<category><![CDATA[Entity Framework]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Une des nouveautés les plus intéressantes qu’apporte Entity Framework 4.3.1 est la migration pour les mises à jour de la base de données. Précédemment, avec Code First, si vous vouliez apporter une modification (ajout d’une colonne par exemple) à une &#8230; <a href="https://blog.developpez.com/lilroma/p10807/net/asp_net_mvc_4_utilisation_de_code_first_">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Une des nouveautés les plus intéressantes qu’apporte Entity Framework 4.3.1 est la migration pour les mises à jour de la base de données.</p>
<p>Précédemment, avec Code First, si vous vouliez apporter une modification (ajout d’une colonne par exemple) à une table de votre base de données, si vous vous limitiez à définir uniquement la nouvelle colonne dans votre modèle, lors de l’exécution de l’application vous obteniez un message d’erreur puisque le modèle ne correspond plus aux objets de la BD.</p>
<p>En apportant les modifications du côté de la base de données, il fallait de nouveau mettre à jour le modèle. Cette action avait pour conséquence de régénérer à nouveau le modèle, avec éventuellement la perte de la personnalisation (message d’erreur de validation, définition des attributs Display, etc.) que vous aviez effectué dans votre modèle.</p>
<p>Avec la migration de base de données introduite par la version 4.3.1 d’Entity Framework,  des modifications peuvent être apportées facilement et aisément à la base de données à partir du modèle.</p>
<p><span id="more-79"></span></p>
<p>Assez de charabia. Voyons concrètement de quoi il s’agit en touchant cette nouveauté « du bout du doigt ».</p>
<p>Créez une nouvelle application ASP.NET MVC 4 « DataMigration » en utilisant le modèle Internet Application.  Avec NuGet, vous allez faire une mise à jour d’Entity Framework vers la dernière version de la bibliothèque qui ajoute les fonctionnalités de migration des bases de données.</p>
<p><img src="http://blog.developpez.com/media/nugetupdate.png" width="792" height="449" alt="" /> </p>
<p>Vous devez maintenant ajouter une nouvelle classe « Customer » dans le modèle représentant un client.  Le code de cette classe est le suivant :</p>
<div style="background: #ffffff; overflow:auto;width:auto;color:black;background:white;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;">
<pre style="margin: 0; line-height: 125%"><span style="color: #008000; font-weight: bold">public</span> <span style="color: #008000; font-weight: bold">class</span> <span style="color: #B00060; font-weight: bold">Customer</span>
    {
        <span style="color: #008000; font-weight: bold">public</span> <span style="color: #303090; font-weight: bold">short</span> Id { <span style="color: #008000; font-weight: bold">get</span>; <span style="color: #008000; font-weight: bold">set</span>; }
        <span style="color: #008000; font-weight: bold">public</span> <span style="color: #303090; font-weight: bold">string</span> FirstName { <span style="color: #008000; font-weight: bold">get</span>; <span style="color: #008000; font-weight: bold">set</span>; }
        <span style="color: #008000; font-weight: bold">public</span> <span style="color: #303090; font-weight: bold">string</span> LastName { <span style="color: #008000; font-weight: bold">get</span>; <span style="color: #008000; font-weight: bold">set</span>; }
       
    }
</pre>
</div>
<p>Vous allez par la suite créer un nouveau contrôleur en utilisant Entity Framework pour les actions CRUD.</p>
<p>Dans les options de scalffolding, vous devez sélectionner la classe Customer. Dans la zone Data context class, vous allez sélectionner « New data context…>. Renseignez le nom du Data Context « DataMigrationContext », validez ensuite sur OK et cliquez enfin sur Ajouter.</p>
<p><img src="http://blog.developpez.com/media/controller.png" width="600" height="392" alt="" /> </p>
<p>Un fichier DataMigrationContext.cs sera automatiquement ajouté à l’application.</p>
<p>Exécutez l’application pour que Code First utilise le modèle pour créer la base de données qui sera automatiquement ajoutée à votre instance SQLEXPRESS locale.</p>
<p><img src="http://blog.developpez.com/media/DatabaseExplorer.png" width="256" height="331" alt="" />                                                 </p>
<p><strong>Activation de la migration</strong></p>
<p>Supposons que vous avez oublié une propriété Email dans votre modèle. Vous allez donc modifier celui-ci en ajoutant cette nouvelle propriété :</p>
<div style="background: #ffffff; overflow:auto;width:auto;color:black;background:white;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;">
<pre style="margin: 0; line-height: 125%"><span style="color: #008000; font-weight: bold">public</span> <span style="color: #008000; font-weight: bold">class</span> <span style="color: #B00060; font-weight: bold">Customer</span>
    {
        <span style="color: #008000; font-weight: bold">public</span> <span style="color: #303090; font-weight: bold">short</span> Id { <span style="color: #008000; font-weight: bold">get</span>; <span style="color: #008000; font-weight: bold">set</span>; }
        <span style="color: #008000; font-weight: bold">public</span> <span style="color: #303090; font-weight: bold">string</span> FirstName { <span style="color: #008000; font-weight: bold">get</span>; <span style="color: #008000; font-weight: bold">set</span>; }
        <span style="color: #008000; font-weight: bold">public</span> <span style="color: #303090; font-weight: bold">string</span> LastName { <span style="color: #008000; font-weight: bold">get</span>; <span style="color: #008000; font-weight: bold">set</span>; }
        <span style="color: #008000; font-weight: bold">public</span> <span style="color: #303090; font-weight: bold">string</span> EMail { <span style="color: #008000; font-weight: bold">get</span>; <span style="color: #008000; font-weight: bold">set</span>; }

    }
</pre>
</div>
<p>Si vous exécutez votre application ainsi, vous allez obtenir le message d’erreur suivant :</p>
<p><img src="http://blog.developpez.com/media/apperror.png" width="700" height="203" alt="" /> </p>
<p>Comme l’exception le signale, il est temps pour vous d’utiliser Code First Migrations pour procéder à la mise à jour de votre base de données.</p>
<p>La première étape est d’activer la migration pour votre Context, en utilisant la console du gestionnaire de packages. Vous allez exécuter la commande suivante : <strong>Enabled-Migrations</strong>.</p>
<p><img src="http://blog.developpez.com/media/enablemigration.png" width="576" height="162" alt="" /> </p>
<p>L’activation de la migration crée un nouveau dossier Migrations dans votre application contenant un fichier Configurations.cs permettant de définir le comportement de la migration pour le Context, et un autre fichier contenant une procédure Up() qui contient des instructions pour créer la table avec la définition initiale de celle-ci, et une autre procédure Down pour supprimer la table.</p>
<div style="background: #ffffff; overflow:auto;width:auto;color:black;background:white;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;">
<pre style="margin: 0; line-height: 125%"><span style="color: #008000; font-weight: bold">public</span> <span style="color: #008000; font-weight: bold">partial</span> <span style="color: #008000; font-weight: bold">class</span> <span style="color: #B00060; font-weight: bold">InitialCreate</span> : DbMigration
    {
        <span style="color: #008000; font-weight: bold">public</span> <span style="color: #008000; font-weight: bold">override</span> <span style="color: #008000; font-weight: bold">void</span> <span style="color: #0060B0; font-weight: bold">Up</span>()
        {
            CreateTable(
                <span style="background-color: #fff0f0">&quot;Customers&quot;</span>,
                c =&gt; <span style="color: #008000; font-weight: bold">new</span>
                    {
                        Id = c.Short(nullable: <span style="color: #008000; font-weight: bold">false</span>, identity: <span style="color: #008000; font-weight: bold">true</span>),
                        FirstName = c.String(),
                        LastName = c.String(),
                    })
                .PrimaryKey(t =&gt; t.Id);
            
        }
        
        <span style="color: #008000; font-weight: bold">public</span> <span style="color: #008000; font-weight: bold">override</span> <span style="color: #008000; font-weight: bold">void</span> <span style="color: #0060B0; font-weight: bold">Down</span>()
        {
            DropTable(<span style="background-color: #fff0f0">&quot;Customers&quot;</span>);
        }
    }
</pre>
</div>
<p><strong>Ajout d’une nouvelle migration</strong></p>
<p>Vous allez maintenant ajouter une nouvelle migration pour prendre en compte le nouvel attribut dans la base de données. Vous allez utiliser la commande <strong>Add-Migration</strong> suivie du nom de la migration :</p>
<p><img src="http://blog.developpez.com/media/addmigration.png" width="662" height="169" alt="" /> </p>
<p>Un nouveau fichier 201203082156197_FirstMigration.cs sera automatiquement ajouté au dossier Migrations :</p>
<p><img src="http://blog.developpez.com/media/MigrationFolder.png" width="345" height="91" alt="" /> </p>
<p>Ce fichier contient par défaut le code suivant :</p>
<div style="background: #ffffff; overflow:auto;width:auto;color:black;background:white;border:solid gray;border-width:.1em .1em .1em .8em;padding:.2em .6em;">
<pre style="margin: 0; line-height: 125%"><span style="color: #008000; font-weight: bold">namespace</span> <span style="color: #0e84b5; font-weight: bold">DataMigration.Migrations</span>
{
    <span style="color: #008000; font-weight: bold">using</span> <span style="color: #0e84b5; font-weight: bold">System.Data.Entity.Migrations</span>;
    
    <span style="color: #008000; font-weight: bold">public</span> <span style="color: #008000; font-weight: bold">partial</span> <span style="color: #008000; font-weight: bold">class</span> <span style="color: #B00060; font-weight: bold">FirstMigration</span> : DbMigration
    {
        <span style="color: #008000; font-weight: bold">public</span> <span style="color: #008000; font-weight: bold">override</span> <span style="color: #008000; font-weight: bold">void</span> <span style="color: #0060B0; font-weight: bold">Up</span>()
        {
            AddColumn(<span style="background-color: #fff0f0">&quot;Customers&quot;</span>, <span style="background-color: #fff0f0">&quot;EMail&quot;</span>, c =&gt; c.String());
        }
        
        <span style="color: #008000; font-weight: bold">public</span> <span style="color: #008000; font-weight: bold">override</span> <span style="color: #008000; font-weight: bold">void</span> <span style="color: #0060B0; font-weight: bold">Down</span>()
        {
            DropColumn(<span style="background-color: #fff0f0">&quot;Customers&quot;</span>, <span style="background-color: #fff0f0">&quot;EMail&quot;</span>);
        }
    }
}
</pre>
</div>
<p>Vous pouvez apporter des modifications à ce fichier en ajoutant ou supprimant de nouvelles colonnes. Lorsque tout est Ok, vous pouvez utiliser la commande <strong>Update-Database</strong> pour appliquer cette migration sur la base de données.</p>
<p>Vous pouvez observer les modifications qui ont été apportées à la base de données dans l’explorateur de serveur:</p>
<p><img src="http://blog.developpez.com/media/databaseexplorer2.png" width="273" height="359" alt="" /></p>
<p>Et voilà, vous venez grâce à Code First Migrations d’apporter les modifications qui ont été effectuées du côté du code de votre application à la base de données.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ASP.NET MVC 4 Bêta : premier pas avec ASP.NET Web API</title>
		<link>https://blog.developpez.com/lilroma/p10768/net/asp_net_mvc_4_beta_premier_pas_avec_asp_</link>
		<comments>https://blog.developpez.com/lilroma/p10768/net/asp_net_mvc_4_beta_premier_pas_avec_asp_#comments</comments>
		<pubDate>Wed, 29 Feb 2012 00:30:26 +0000</pubDate>
		<dc:creator><![CDATA[Hinault Romaric]]></dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[ASP.NET MVC 4]]></category>
		<category><![CDATA[ASP.NET Web API]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[Dans mon précédent billet de blog, j’ai présenté sommairement les nouveautés qui ont été introduites par ASP.NET MVC 4 bêta, la prochaine mise à jour majeure du framework Web open source de Microsoft. Aujourd’hui, je vais revenir sur l’une de &#8230; <a href="https://blog.developpez.com/lilroma/p10768/net/asp_net_mvc_4_beta_premier_pas_avec_asp_">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>Dans mon<a href="http://blog.developpez.com/lilroma/p10734/"> précédent billet de blog</a>, j’ai présenté sommairement les nouveautés qui ont été introduites par ASP.NET MVC 4 bêta, la prochaine mise à jour majeure du framework Web open source de Microsoft.</p>
<p>Aujourd’hui, je vais revenir sur l’une de ces nouveautés les plus importantes à savoir : Web API. <strong>ASP.NET Web API</strong> a pour objectif principal de permettre aux développeurs d’exposer leurs applications, données et services sur le web directement à travers HTTP.</p>
<p>Le support d’ASP.NET Web API permet de créer facilement des API Web puissantes, qui peuvent être consultées à partir d’un large éventail de client (réseaux sociaux, navigateurs, terminaux mobiles, etc.). Web API fournit les fonctionnalités suivantes :</p>
<p><span id="more-77"></span></p>
<p>•  <strong>Modèle de programmation HTTP moderne</strong> : l’API Web permet d’accéder directement et manipuler les requêtes et réponses HTTP à l’aide d’un nouveau modèle objet HTTP fortement  typé. Le même modèle de programmation HTTP est pratiquement disponible sur le client par l’intermédiaire de HttpClient pouvant être utilisé pour appeler des API Web dans n’importe quelle application .NET.</p>
<p>•  <strong>Négociation de contenu</strong> : Le client et le serveur peuvent travailler ensemble afin de déterminer le bon format pour les données retournées à partir d’une API. Les formats pris en charge par défaut sont le XML et JSON. Le développeur pourra élargir ce soutien en ajoutant ses propres formats, ou même en remplaçant la stratégie de négociation du contenu par défaut.</p>
<p>•   <strong>Prise en charge complète des routes</strong> : l’API Web prend désormais en charge l’ensemble des fonctionnalités de route qui ont toujours été une partie de la pile Web, y compris les paramètres d’itinéraire et les contraintes. En outre, la cartographie des actions possède un support complet pour les conventions, de sorte que le développeur n’aura plus besoin d’appliquer des attributs à une classe ou méthode. La configuration de Web API se fait uniquement à travers le code.</p>
<p>•   <strong>Composition de requêtes</strong> : Web API permet de prendre rapidement en charge l’interrogation par l’intermédiaire des conventions URL OData. Lorsque le développeur retourne un type IQueryable de son API Web, le cadre fournira rapidement un soutien pour OData, rendant facile l’implémentation de la pagination et le tri.</p>
<p>•   <strong>Validation des modèles</strong> : Le modèle fournit un moyen facile d’extraire des données de diverses parties d’une requête HTTP et de convertir ces parties du message en objets .NET, qui peuvent être utilisés par des actions Web API. Web API offre le même support qu’ASP.NET MVC pour la liaison des modèles et l’infrastructure de validation.</p>
<p>•   <strong>Filtres</strong> : l’API Web permet de créer et utiliser facilement des filtres, qui permettent d’encapsuler et d’appliquer divers comportements.</p>
<p>•   <strong>Améliorations des tests</strong> : plutôt que de fixer des détails dans les objets de contexte HTTP statiques,  les actions Web API peuvent maintenant travailler avec les instances de HttpResquestMessage et HttpResponseMessage, deux nouveaux objets HTTP qui permettent d’effectuer plus facilement des tests.</p>
<p>•   <strong>Support de l’IoC</strong> : Web API prend en charge le modèle de service de localisation mis en œuvre par ASP.NET MVC, qui permet de résoudre les dépendances pour de nombreux dispositifs différents. Le développeur peut facilement intégrer cela avec un conteneur IoC, ou un cadre permettant l’injection de dépendances.</p>
<p>•   <strong>Flexibilité lors de l’hébergement</strong> : Web API peut être déployé dans n’importe quel type d’application ASP.NET (y compris à la fois ASP.NET MVC et ASP.NET Web Forms). Web API peut également être hébergé au sein de votre plateforme, si vous ne voulez pas utiliser ASP.NET/IIS pour le faire. Cela vous donne un maximum de flexibilité dans la façon dont vous l’utilisez.</p>
<p>Voyons de près quelques-unes de ces fonctionnalités au travers d’une application Web API.</p>
<p>Lors de la création d’un nouveau projet ASP.NET MVC 4, un nouveau modèle de projet est disponible dans les Templates par défaut qui fournit une implémentation basique d’une API Web.</p>
<p><img src="http://blog.developpez.com/media/SelectTemplate.png" width="679" height="573" alt="" /></p>
<p>Par défaut, un nouveau contrôleur Web API qui hérite de ApiController est disponible dans ce modèle de projet, qui illustre comment vous pouvez créer des requêtes Get(), Post(), Put() et Delete() pour votre API.</p>
<div id="codeSnippetWrapper">
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px" id="codeSnippet"><span style="color: #0000ff">public</span> <span style="color: #0000ff">class</span> ValuesController : ApiController<br />    {<br />        <span style="color: #008000">// GET /api/values</span><br />        <span style="color: #0000ff">public</span> IEnumerable&lt;<span style="color: #0000ff">string</span>&gt; Get()<br />        {<br />            <span style="color: #0000ff">return</span> <span style="color: #0000ff">new</span> <span style="color: #0000ff">string</span>[] { <span style="color: #006080">&quot;value1&quot;</span>, <span style="color: #006080">&quot;value2&quot;</span> };<br />        }<br /><br />        <span style="color: #008000">// GET /api/values/5</span><br />        <span style="color: #0000ff">public</span> <span style="color: #0000ff">string</span> Get(<span style="color: #0000ff">int</span> id)<br />        {<br />            <span style="color: #0000ff">return</span> <span style="color: #006080">&quot;value&quot;</span>;<br />        }<br /><br />        <span style="color: #008000">// POST /api/values</span><br />        <span style="color: #0000ff">public</span> <span style="color: #0000ff">void</span> Post(<span style="color: #0000ff">string</span> <span style="color: #0000ff">value</span>)<br />        {<br />        }<br /><br />        <span style="color: #008000">// PUT /api/values/5</span><br />        <span style="color: #0000ff">public</span> <span style="color: #0000ff">void</span> Put(<span style="color: #0000ff">int</span> id, <span style="color: #0000ff">string</span> <span style="color: #0000ff">value</span>)<br />        {<br />        }<br /><br />        <span style="color: #008000">// DELETE /api/values/5</span><br />        <span style="color: #0000ff">public</span> <span style="color: #0000ff">void</span> Delete(<span style="color: #0000ff">int</span> id)<br />        {<br />        }<br />    }<br /></pre>
<p></div>
<p><strong>Support complet des routes</strong></p>
<p>Comme pour ASP.NET MVC, la définition des routes pour Web API est effectuée dans le fichier Global.ascx. Les routes pour Web API reprennent quasiment le même format que celle de MVC, afin que le développeur puisse capitaliser sur ses notions acquises.</p>
<p>En ouvrant donc le fichier Global.ascx,  la route suivante est définie par défaut pour l’API Web :</p>
<div id="codeSnippetWrapper">
<pre id="codeSnippet" style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border-style: none; color: black; overflow: visible; padding: 0px; width: 100%; margin: 0em; direction: ltr; text-align: left;">routes.MapHttpRoute(<br />                name: <span style="color: #006080;">"DefaultApi"</span>,<br />                routeTemplate: <span style="color: #006080;">"api/{controller}/{id}"</span>,<br />                defaults: <span style="color: #0000ff;">new</span> { id = RouteParameter.Optional }<br />            );</pre>
<p></div>
<p>A la différence de MVC, la route est ajoutée dans MapHttpRoute() et  la méthode d’action n’est par définie dans le modèle de route. Ce qui implique que le développeur n’a pas besoins de spécifier une action. Web API identifie automatiquement la méthode du contrôleur qui sera exécutée en fonction du verbe HTTP qui est effectué (GET, POST, etc.).</p>
<p>Jetons un premier coup d’œil sur notre API Web en utilisant le contrôleur d’exemple (Values) inclus dans l’application pour avoir un aperçu du résultat qui est retourné.<br />
Il suffit d’exécuter l’application et renseigner dans la barre d’adresse du navigateur l’URL suivant : « …/api/Values ».</p>
<p>Le résultat qui est retourné au format XML est le suivant :</p>
<div id="codeSnippetWrapper">
<pre id="codeSnippet" style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border-style: none; color: black; overflow: visible; padding: 0px; width: 100%; margin: 0em; direction: ltr; text-align: left;"><br />&lt;ArrayOfString xmlns:xsi=<span style="color: #006080;">"http://www.w3.org/2001/XMLSchema-instance"</span> xmlns:xsd=<span style="color: #006080;">"http://www.w3.org/2001/XMLSchema"</span>&gt;<br />&lt;<span style="color: #0000ff;">string</span>&gt;value1&lt;/<span style="color: #0000ff;">string</span>&gt;<br />&lt;<span style="color: #0000ff;">string</span>&gt;value2&lt;/<span style="color: #0000ff;">string</span>&gt;<br />&lt;/ArrayOfString&gt;<br /></pre>
<p></div>
<p>Passons maintenant à un exemple plus concret qui présente comment mettre en œuvre simplement des actions CRUD avec ASP.NET Web API.  </p>
<p>Il est possible de créer un API controller avec par défaut les actions Read/Write. La boite de dialogue contient désormais un nouveau template pour la création d’un contrôleur qui hérite d’APIController avec des actions Read/Write.</p>
<p><img src="http://blog.developpez.com/media/createcontroller.png" width="601" height="395" alt="" /> </p>
<p>Lorsque l’on crée un contrôleur en utilisant ce modèle, il contient par défaut les actions Get, Post, Put et Delete tel que mentionné ci-haut.</p>
<p>Ces actions peuvent être modifiées comme suit pour exposer les fonctionnalités CRUD de l’application directement à travers HTTP.</p>
<div id="codeSnippetWrapper">
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px" id="codeSnippet"><span style="color: #0000ff">public</span> <span style="color: #0000ff">class</span> CustomerController : ApiController<br />    {<br /><br />        <span style="color: #0000ff">private</span> CustomerRepository repository = <span style="color: #0000ff">new</span> CustomerRepository();<br /> <br />        <span style="color: #008000">// GET /api/customer</span><br />        <span style="color: #0000ff">public</span> IEnumerable&lt;Customer&gt; Get()<br />        {<br />        <br />           <span style="color: #0000ff">return</span> repository.GetAll();<br />        }<br /><br />        <span style="color: #008000">// GET /api/customer/5</span><br />        <span style="color: #0000ff">public</span> Customer Get(<span style="color: #0000ff">int</span> id)<br />        {<br />            var customer = repository.Single(id);<br /><br />           <span style="color: #0000ff">return</span> customer;<br />        }<br /><br />        <span style="color: #008000">// POST /api/customer</span><br />        <span style="color: #0000ff">public</span> HttpResponseMessage Post(Customer customer)<br />        {<br />            Int id = repository.Add(customer);<br /><br />            <span style="color: #008000">//spécification de l'emplacement du produit au Client REST</span><br />            var response = <span style="color: #0000ff">new</span> HttpResponseMessage(HttpStatusCode.Created);<br />            response.Headers.Location = <span style="color: #0000ff">new</span> Uri(<span style="color: #006080">&quot;/api/customer/&quot;</span> + id);<br /><br />            <span style="color: #0000ff">return</span> response;<br />        }<br /><br />        <span style="color: #008000">// PUT /api/customer/5</span><br />        <span style="color: #0000ff">public</span> <span style="color: #0000ff">void</span> Put(<span style="color: #0000ff">int</span> id, Customer customer)<br />        {<br />            var customeri = repository.Single(id);<br /><br />            <span style="color: #0000ff">if</span> (customeri == <span style="color: #0000ff">null</span>)<br />                <span style="color: #008000">//Informe le client que la ressource n'existe pas</span><br />                <span style="color: #0000ff">throw</span> <span style="color: #0000ff">new</span> HttpResponseException(HttpStatusCode.NotFound);<br /><br />            repository.SaveChanges(customer);<br />        }<br /><br />        <span style="color: #008000">// DELETE /api/customer/5</span><br />        <span style="color: #0000ff">public</span> HttpResponseMessage Delete(<span style="color: #0000ff">int</span> id)<br />        {<br />            Customer customer = repository.Single(id);<br />            <br />            <span style="color: #0000ff">this</span>.repository.Delete(customer);<br />            <span style="color: #008000">//Confirmation de la suppression au client </span><br />            <span style="color: #0000ff">return</span> <span style="color: #0000ff">new</span> HttpResponseMessage(HttpStatusCode.NoContent);<br />        }<br />    }<br /><br /></pre>
<p></div>
<p>Comme je l’ai signalé plus haut avec la négociation de contenu, Web API peut automatiquement sérialiser votre modèle aux différents formats qui sont supportés (JSON, XML, etc.) et ensuite écrire les données sérialisées dans le corps du message de la réponse HTTP. Le client peut desérialiser l’objet transmis par HTTP tant qu’il peut lire le format de sérialisation. La plupart des clients supportent par défaut le format XML et JSON. </p>
<p><strong>-  Appel du service avec JavaScript</strong></p>
<p>Voyons maintenant comment appeler le service en utilisant JavaScript. Le script ci-dessous permet d’appeler le verbe Get pour lire les données.</p>
<div id="codeSnippetWrapper">
<pre id="codeSnippet" style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border-style: none; color: black; overflow: visible; padding: 0px; width: 100%; margin: 0em; direction: ltr; text-align: left;">&lt;!DOCTYPE html&gt;<br />&lt;html lang=<span style="color: #006080;">"en"</span>&gt;<br />&lt;head&gt;<br />    &lt;title&gt;ASP.NET Web API&lt;/title&gt;<br />    &lt;script src=<span style="color: #006080;">"../../Scripts/jquery-1.6.2.min.js"</span> type=<span style="color: #006080;">"text/javascript"</span>&gt;&lt;/script&gt;<br />    &lt;script type=<span style="color: #006080;">"text/javascript"</span>&gt;<br />        $(document).ready(<span style="color: #0000ff;">function</span> () {<br />            <span style="color: #008000;">// Envoi de la requête Ajax</span><br />            $.getJSON(<span style="color: #006080;">"api/Customer/"</span>,<br />            <span style="color: #0000ff;">function</span> (data) {<br />                <span style="color: #008000;">// En cas de succès, 'data' contient la liste des clients.</span><br />                $.each(data, <span style="color: #0000ff;">function</span> (key, val) {<br /><br />                         <span style="color: #0000ff;">var</span> str = val.Id + <span style="color: #006080;">' '</span> + val.FirstName + <span style="color: #006080;">' '</span> + val.LastName;<br /><br />                         $(<span style="color: #006080;">'&lt;li/&gt;'</span>, { html: str }).appendTo($(<span style="color: #006080;">'#customers'</span>));<br />                });<br />            });<br />        });<br />    &lt;/script&gt;<br />&lt;/head&gt;<br />&lt;body&gt;<br />    &lt;div&gt;<br />        &lt;h1&gt;Customers&lt;/h1&gt;<br />        &lt;ul id=<span style="color: #006080;">'customers'</span> /&gt;<br />    &lt;/div&gt;<br />&lt;/body&gt;<br />&lt;/html&gt;<br /></pre>
<p></div>
<p>En remplaçant le code de la page Index.cshtml de mon application par celui ci-dessus, j’obtiens le résultat suivant dans mon navigateur :</p>
<p><img src="http://blog.developpez.com/media/testwebapi_01.png" width="514" height="327" alt="" /> </p>
<p>&#8211;  <strong>Utilisation de HttpClient</strong></p>
<p>Il est également possible d’utiliser la Classe HttpClient pour accéder à une WebAPI dans n’importe quelle application .NET (WebForms, MVC, WinForms, Console, etc.).  Elle permet d’effectuer avec souplesse des appels HTTP en utilisant les méthodes GetAsync, PostAsync, PutAsync, DeleteAsync qui vont appeler les verbes Get, Post, Put et Delete.</p>
<p>Exemple :</p>
<div id="codeSnippetWrapper">
<pre id="codeSnippet" style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border-style: none; color: black; overflow: visible; padding: 0px; width: 100%; margin: 0em; direction: ltr; text-align: left;">HttpClient client = <span style="color: #0000ff;">new</span> HttpClient();<br />            client.DefaultRequestHeaders.Accept.Add(<span style="color: #0000ff;">new</span> MediaTypeWithQualityHeaderValue(<span style="color: #006080;">"application/xml"</span>));<br />            var response = client.GetAsync(<span style="color: #006080;">"http://localhost:1369/api/Customer"</span>).Result;<br /></pre>
<p></div>
<p>Pour spécifier que les données retournées doivent être au format JSON, on peut procéder comme suit :</p>
<div id="codeSnippetWrapper">
<pre id="codeSnippet" style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border-style: none; color: black; overflow: visible; padding: 0px; width: 100%; margin: 0em; direction: ltr; text-align: left;">HttpClient client = <span style="color: #0000ff;">new</span> HttpClient();<br />            client.DefaultRequestHeaders.Accept.Add(<span style="color: #0000ff;">new</span> MediaTypeWithQualityHeaderValue(<span style="color: #006080;">"application/json"</span>));<br />            var response = client.GetAsync(<span style="color: #006080;">"http://localhost:1369/api/Customer"</span>).Result;<br /></pre>
<p></div>
<p>L’intégration d’ASP.NET Web API dans ASP.NET MVC 4 est vraiment fluide et permet au développeur de capitaliser sur ses acquis pour facilement exposer les fonctionnalités de son application via HTTP.</p>
<p>Ressources sur WebApi</p>
<p> &#8211; <a href="http://blogs.msdn.com/b/henrikn/">Henrik F Nielsen</a><br />
 &#8211; <a href="http://www.asp.net/web-api">Les ressources Web API sur ASP.NET</a></p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>ASP.NET MVC 4 beta : introduction de l’API Web et améliorations de Razor</title>
		<link>https://blog.developpez.com/lilroma/p10734/net/asp_net_mvc_4_beta_introduction_de_l_api</link>
		<comments>https://blog.developpez.com/lilroma/p10734/net/asp_net_mvc_4_beta_introduction_de_l_api#comments</comments>
		<pubDate>Mon, 20 Feb 2012 10:46:21 +0000</pubDate>
		<dc:creator><![CDATA[Hinault Romaric]]></dc:creator>
				<category><![CDATA[.NET]]></category>
		<category><![CDATA[ASP.NET]]></category>
		<category><![CDATA[ASP.NET MVC 4]]></category>
		<category><![CDATA[RAZOR]]></category>

		<guid isPermaLink="false"></guid>
		<description><![CDATA[ASP.NET MVC 4 vient de franchir une nouvelle étape dans son cycle de développement. Microsoft vient de publier la version Beta du framework Web open source fondé sur ASP.NET. En dehors des nouveautés disponibles dans la version Developper Previw publiée &#8230; <a href="https://blog.developpez.com/lilroma/p10734/net/asp_net_mvc_4_beta_introduction_de_l_api">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
				<content:encoded><![CDATA[<p>ASP.NET MVC 4 vient de franchir une nouvelle étape dans son cycle de développement. Microsoft vient de publier la version Beta du framework Web open source fondé sur ASP.NET.</p>
<p>En dehors des nouveautés disponibles dans la version Developper Previw publiée en septembre dernier dont <a href="http://blog.developpez.com/lilroma/p10326/net/asp-net/asp-net-mvc-4/asp-net-mvc-4-developer-preview-nouveaut/">le support des plateformes mobiles</a>, <a href="http://blog.developpez.com/lilroma/p10420/net/asp-net/asp-net-mvc-4/asp-net-mvc-4-developer-preview-ameliora/">le rendu adaptatif</a>, <a href="http://blog.developpez.com/lilroma/p10343/net/asp-net/asp-net-mvc-4/asp-net-mvc-4-developer-preview-jquery-m/">View Switcher</a>, des nouveaux modèles de projet Web, etc. la bêta apporte plusieurs corrections de bug et quelques nouveautés donc la plus importante est l’introduction de l’API Web.</p>
<p><span id="more-67"></span></p>
<p><strong>L’API Web</strong></p>
<p>Web API a fait son apparition dans WCF. Elle a pour objectif principal de permettre aux développeurs d’exposer leurs applications, données et services sur le web directement à travers HTTP.</p>
<p>Au vu des besoins d’interaction de plus en plus croissants entre une application Web et un ensemble très large de clients (réseaux sociaux, navigateurs, terminaux mobiles, etc.), il était indispensable de fournir aux développeurs un moyen de communiquer dans leurs applications avec ces différents types de clients.  Pour ne pas avoir à développer deux outils différents permettant d’effectuer les mêmes actions, l’équipe d’ASP.NET MVC  c’est chargée d’intégrer WCF Web API avec le Framework de développement qui devient Web API.</p>
<p><img src="http://blog.developpez.com/media/webapi.png" width="676" height="606" alt="" /></p>
<p><strong>Regroupement par défaut</strong></p>
<p>Depuis la Developer Previw d’ASP.NET MVC 4, la librairie Microsoft.Web.Optimisation avait été introduite à la plateforme, ainsi qu’a ASP.NET 4.5, pour permettre d’optimiser les performances d’une application et améliorer le temps de chargement des pages en utilisant le regroupement et la minification à la volée du JavaScript et CSS.</p>
<p>Avec la bêta de MVC 4, le regroupement est utilisé par défaut dans les modèles projets Web. A l’ouverture d’un Template, vous trouverez dans le fichier Layout les lignes de code suivantes dans la balise Head :</p>
<div id="codeSnippetWrapper">
<pre id="codeSnippet" style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border-style: none; color: black; overflow: visible; padding: 0px; width: 100%; margin: 0em; direction: ltr; text-align: left;">&lt;head&gt;<br />        &lt;meta charset=<span style="color: #006080;">"utf-8"</span> /&gt;<br />        &lt;title&gt;@ViewBag.Title - My ASP.NET MVC Application&lt;/title&gt;<br />        &lt;link href=<span style="color: #006080;">"~/favicon.ico"</span> rel=<span style="color: #006080;">"shortcut icon"</span> type=<span style="color: #006080;">"image/x-icon"</span> /&gt;<br />        &lt;link href=<span style="color: #006080;">"@System.Web.Optimization.BundleTable.Bundles.ResolveBundleUrl("</span>~/Content/css<span style="color: #006080;">")"</span> rel=<span style="color: #006080;">"stylesheet"</span> type=<span style="color: #006080;">"text/css"</span> /&gt;<br />        &lt;link href=<span style="color: #006080;">"@System.Web.Optimization.BundleTable.Bundles.ResolveBundleUrl("</span>~/Content/themes/<span style="color: #0000ff;">base</span>/css<span style="color: #006080;">")"</span> rel=<span style="color: #006080;">"stylesheet"</span> type=<span style="color: #006080;">"text/css"</span> /&gt;<br />        &lt;script src=<span style="color: #006080;">"@System.Web.Optimization.BundleTable.Bundles.ResolveBundleUrl("</span>~/Scripts/js<span style="color: #006080;">")"</span>&gt;&lt;/script&gt;<br />        &lt;meta name=<span style="color: #006080;">"viewport"</span> content=<span style="color: #006080;">"width=device-width"</span> /&gt;<br />    &lt;/head&gt;<br /></pre>
<p></div>
<p>Pour plus de détail sur l’utilisation du regroupement et la minification du JavaScript dans une application Web, <a href="http://blog.developpez.com/lilroma/p10462/net/asp-net/microsoft-web-optimisation-ou-comment-op/">voir mon article sur le sujet</a>.</p>
<p><strong>Améliorations de Razor</strong></p>
<p>Le moteur de vue Razor qui à fait son apparition avec MVC 3, croit en maturité dans cette version, avec des améliorations qui simplifient sa syntaxe dans certains scénarios courants.</p>
<p>&#8211; Résolution d’URL : prise en charge de « ~ » dans la syntaxe.</p>
<p>Désormais au lieu d&rsquo;écrire :</p>
<div id="codeSnippetWrapper">
<pre id="codeSnippet" style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border-style: none; color: black; overflow: visible; padding: 0px; width: 100%; margin: 0em; direction: ltr; text-align: left;">&lt;scriptsrc=<span style="color: #006080;">"@Url.Content("</span>~/Scripts/Site.js<span style="color: #006080;">")"</span>&gt;&lt;/script&gt;</pre>
<p></div>
<p>Le développeur pourra écrire :</p>
<div id="codeSnippetWrapper">
<pre id="codeSnippet" style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border-style: none; color: black; overflow: visible; padding: 0px; width: 100%; margin: 0em; direction: ltr; text-align: left;">&lt;scriptsrc=<span style="color: #006080;">"~/Scripts/Site.js"</span>&gt;&lt;/script&gt;</pre>
<p></div>
<p>&#8211; Rendu conditionnel d’attribut</p>
<p>Précédemment, si vous vouliez utiliser un attribut qui peut-être nul,  vous deviez vérifier au préalable si celui-ci  n’est pas vide avant de l’utiliser.</p>
<div id="codeSnippetWrapper">
<pre id="codeSnippet" style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border-style: none; color: black; overflow: visible; padding: 0px; width: 100%; margin: 0em; direction: ltr; text-align: left;">&lt;div@{<span style="color: #0000ff;">if</span> (myClass != <span style="color: #0000ff;">null</span>) { &lt;text&gt;<span style="color: #0000ff;">class</span>=<span style="color: #006080;">"@myClass"</span>&lt;/text&gt; } }&gt;Content&lt;/div&gt;</pre>
<p></div>
<p>Désormais, Razor est capable de gérer cela automatiquement, de telles sortes que vous pouvez directement l’utiliser. Si l’attribut est vide il ne sera simplement pas appelé.</p>
<div id="codeSnippetWrapper">
<pre style="border-bottom-style: none; text-align: left; padding-bottom: 0px; line-height: 12pt; background-color: #f4f4f4; margin: 0em; border-left-style: none; padding-left: 0px; width: 100%; padding-right: 0px; font-family: &#39;Courier New&#39;, courier, monospace; direction: ltr; border-top-style: none; color: black; border-right-style: none; font-size: 8pt; overflow: visible; padding-top: 0px" id="codeSnippet">&lt;div <span style="color: #0000ff">class</span>=<span style="color: #006080">&quot;@myClass&quot;</span>&gt;Content&lt;/div&gt;</pre>
<p></div>
<p>Si l’attribut est donc nul, le rendu de code sera le suivant :</p>
<div id="codeSnippetWrapper">
<pre id="codeSnippet" style="background-color: #f4f4f4; font-family: 'Courier New', Courier, Monospace; font-size: 8pt; line-height: 12pt; border-style: none; color: black; overflow: visible; padding: 0px; width: 100%; margin: 0em; direction: ltr; text-align: left;">&lt;div&gt;Content&lt;/div&gt;</pre>
<p></div>
<p><strong>Utilisation de NuGet pour installer les bibliothèques externes des modèles de projet</strong></p>
<p>Avec la bêta de MVC 4, lorsque que vous créez un nouveau projet, les packages sont installés dans l’application en utilisant NuGet package restore. Le package NuGet restore permet lors de la compilation ou de la création d’une application, de vérifier si les packages présents correspondent aux dernières versions publiées. Si ce n’est pas le cas, il se charge automatiquement d’effectuer la mise à jour.</p>
<p>ASP.NET MVC 4 peut-être utilisé avec Visual Studio 2010 Service pack 1 ou Visual Web Developer 2010 Service Pack 1. La préversion de Visual Studio 11 n’est pas prise en charge.</p>
<p>Le framework peut s’installer via NuGet ou en utilisant le Web plateforme installer. <a href="http://www.asp.net/mvc/mvc4">Les binaires sont également disponibles en téléchargement</a>.</p>
<p>Je reviendrais sur une présentation plus détaillé de Web API dans un prochain billet de blog.</p>
]]></content:encoded>
			<wfw:commentRss></wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
