Archives par mot-clé : .NET

Utilisation du cache ASP.NET dans un Web Service asmx

Une des méthodes pour améliorer les performances de son site web est l’utilisation du cache. Ce dernier permet de garder en mémoire des informations afin de ne pas les recalculer à chaque appel. L’utilité de l’objet cache est qu’il permet de définir une politique d’expiration, c’est à dire de définir combien de temps les données enregistrées dans le cache sont valides. Une fois cette durée expirée, la donnée sera supprimée du cache. Celle-ci sera recalculée à l’appel suivant.

Dans une page aspx, l’accès au cache se fait par l’appel à l’objet Cache. Dans un web service (asmx), il faut passer par le contexte Http : HttpContext.Current.Cache

HttpContext ctx = HttpContext.Current;
//Si la valeur est dans le cache on la renvoie
if (ctx.Cache["CachedData"] != null)
{
    return (CachedData)ctx.Cache["CachedData"];
}
//On récupère et on enregistre dans le cache avec une durée de rétention de 7 jours
CachedDataresult = DataManager.GetData();
ctx.Cache.Insert("CachedData", result, null, DateTime.Today.AddDays(7), TimeSpan.Zero);
return result;

Voici le lien vers la page MSDN

ASP.NET MVC : Présentation de T4MVC

Je viens de changer de boite et mon premier projet est un projet en ASP.NET MVC dans sa version 3. Je vais vous présenter un outil qui permet de faciliter le développement et la maintenance d’un application MVC : T4MVC.

Il s’agit d’un paquet (package) que l’on installe via NuGet, le gestionnaire de package de Visual Studio. Cet outil prend la forme d’un ficher T4 (Text Template Transformation Toolkit), T4MVC.tt, qui sera rajouté à votre projet. Les fichiers T4 permettent de la génération de code.

Dans ASP.NET MVC, dans de nombreux cas, les méthodes prennent en paramètre des chaines de caractères (« magic strings ») où il est facile de se tromper. L’utilisation de T4MVC permet de résoudre ce problème en générant des constantes, des méthodes pouvant prendre en paramètre des expressions lambda afin de réduire les erreurs et leur temps de détection. En effet, avec l’utilisation de chaîne de caractères, une erreur ne sera visible qu’à l’exécution alors qu’en utilisant T4MVC, vos erreurs seront remontées à la compilation.

Installation

Pour l’exemple, j’ai créeé un nouveau projet ASP.NET MVC en ayant sélectionné le template Internet Application.

L’installation de T4MVC se fait via le gestionnaire de paquet NuGet de Visual Studio. Nous allons ici utiliser l’interface graphique mais il est bien évidemment possible de l’installer par la console NuGet. Le lancement du gestionnaire NuGet se fait via un clic droit sur le projet MVC puis Manage NuGet Packages ….

Lancement du gestionnaire de paquet NuGet

Il faut ensuite sélectionner l’onglet Online et effectuer une recherche sur T4MVC et cliquer sur Install.

NuGet Manager - Recherche de T4MVC

NuGet va automatiquement installer les dépendances de T4MVC, dans notre cas T4MVCExtensions.

Installattino de T4MVC

L’installation de ce paquet se traduit par l’ajout de 3 fichiers à la racine du projet :

  • T4MVC.tt : le fichier template dont je parlais précédemment
  • T4MVC.tt.hooks.t4 : un fichier vous permettant d’ajouter votre propre code afin d’améliorer le code généré
  • T4MVC.tt.settings.xml : le fichier de configuration qui permet de notamment modifier les namespaces des fichiers générés

Fichiers T4MVC

La génération de code se fait en faisant un clic droit sur le fichier T4MVC.tt et en cliquant sur Run Custom Tool.

Lancement de la génération des fichiers

Une fois la génération effectuée, les fichiers générés se trouvent sous le fichier T4MVC.tt.

T4MVC : Fichiers générés

Je vous conseille également l’utilisation d’extension qui permet le lancement automatique de la transformation à la compilation de votre projet comme AutoT4MVC ou Chirpy. Sinon, vous devrez le lancer manuellement, ce qui s’avère lourd à force.

Activation de la compilation des vues

Par défaut, les vues ne sont pas compilés lors de la génération de la solution. Afin d’obtenir les erreurs dans vos vues à la compilation, il est nécessaire d’activer cette option. Pour cela il faut modifier le fichier .csproj (ou .vbproj) (via un éditeur de texte externe car non possible directement via VS …) et définir la propriété MvcBuildViews à true, comme dans l’exemple suivant :

<Project ToolsVersion="3.5" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <PropertyGroup>
    ...
    <MvcBuildViews>true</MvcBuildViews>
    ...
  </PropertyGroup>

La génération du projet sera donc un plus longue …

Utilisation

Comme précisé plus haut, T4MVC génère des classes contenant des méthodes / constantes permettant un code plus propre et plus maintenable. Nous allons voir 2 exemples avec les fichiers et les Actions mais il existe d’autres cas d’utilisation comme la redirection vers les vues, les routes … Je vous conseille la documentation du projet pour en savoir plus

Liens vers des fichiers

T4MVC génère pour les liens vers des fichiers un namespace Links (configurable dans le fichier de configuration) qui contient l’ensemble des fichiers de l’application (css, js, images, …). L’utilisation se fait via la syntaxe suivante Links.Folder.File. Ainsi on remplacera

<link rel="stylesheet" type="text/css" href="/Themes/default.css" />
<script src="/Scripts/jquery.min.js" type="text/javascript"</script>

par :

<link rel="stylesheet" type="text/css" href="@Links.Themes.default_css" />
<script src="@Links.Scripts.jquery_min_js" type="text/javascript"</script>

Comme vous pouvez le voir, les points et les – sont remplacés par des _, il faut donc faire attention au nom de vos fichiers au risque de vous retrouver avec 2 constantes avec le même nom, ce qui ne compilera pas !!!.

Actions

De la même façon, T4MVC génère un namespace MVC (configurable dans le fichier de configuration) contenant les méthodes des controllers. L’utilisation se fait via la syntaxe suivante MVC.Controller.Action. On remplacera donc la syntaxe

@Html.ActionLink('Home', 'Index')

par

@Html.ActionLink('Home', MVC.Home.Index())

Conclusion

T4MVC est un must have dans le développement d’applications ASP.NET MVC que je vous recommande d’utiliser et qui vous fera gagner un temps précieux lors de vos développements et la maintenance de votre application. T4MVC fait partie du projet MvcContrib qui permet de rajouter pas mal de possibilité dans le framework MVC comme des Helpers, des Filters, une librairie de tests, …

WCF : Message vide avec un trop grand nombre de données

J’ai rencontré un problème récemment concernant un service WCF qui ne renvoyait une réponse vide (confirmée par SOAP UI) dans le cas d’un trop grand nombre de donnée. La taille des messages étaient à leur valeur maximale et les messages n’atteignaient pas cette limite. Notre service renvoyait bien des données si on limitait le nombre et cela ne renvoyait plus rien à partir d’une certaine limite.

Afin de résoudre ce problème nous avons activé les traces en plaçant la configuration suivante dans le fichier de configuration de notre service WCF (dans notre cas notre web.config)

	
<system.diagnostics>
	<sources>
		<source name="System.ServiceModel" switchValue="All" propagateActivity="true">
			<listeners>
				<add name="traceListener" type="System.Diagnostics.XmlWriterTraceListener" initializeData="C:\logs\server.webservicelayer_Traces.svclog"/>
			</listeners>
		</source>
	</sources>
</system.diagnostics>

Cela permet de logger les appels à notre service dans un fichier svclog consultable via l’outil Microsoft Trace Service Viewer.

Nous avons alors pu voir que l’erreur était :

System.Runtime.Serialization.SerializationException

Une erreur s’est produite en tentant de sérialiser le paramètre http://monServeur/wcfservices/:GetContratsResult. Le message InnerException était ‘Le nombre maximal d’éléments pouvant être sérialisés ou désérialisés dans un graphique d’objet est ‘65536’. Modifiez le graphique d’objet ou augmentez le quota MaxItemsInObjectGraph. ‘. Pour plus d’informations, consultez InnerException.

Le message d’erreur est explicite et la solution consiste à augmenter le nombre d’objets sérialisable de notre service. Pour cela, il faut modifier le comportement (behavior) de celui-ci via la balise dataContractSerializer et la propriété maxItemsInObjectGraph que nous avons augmentée à la valeur maximale : 2147483647.

<behaviors>
      <serviceBehaviors>
        <behavior>
          <!-- Pour éviter la divulgation des informations sur les métadonnées, définissez la valeur ci-dessous sur false et supprimez le point de terminaison des métadonnées ci-dessus avant le déploiement. -->
          <serviceMetadata httpGetEnabled="true" />
          <!-- Pour recevoir les détails d'exception des erreurs à des fins de débogage, définissez la valeur ci-dessous sur true. Définissez-la sur false avant le déploiement pour éviter la divulgation des informations d'exception. -->
          <serviceDebug includeExceptionDetailInFaults="true" />
          <dataContractSerializer maxItemsInObjectGraph="2147483647" />
        </behavior>
      </serviceBehaviors>
      <endpointBehaviors>
        <behavior name="SilverlightFaultBehavior">
          <silverlightFaults />
        </behavior>
      </endpointBehaviors>
    </behaviors>

J’espère que cela pourra vous éviter de perdre quelques heures (et quelques cheveux 😉 ).

Dans mon cas, je retiens l’utilisation de l’activation des traces qui est simple à mettre en place et qui peut se révéler très utile !!!

Techdays 2011

J’ai eu la chance de monter sur Paris les 8 et 9 Février pour assister aux Techdays 2011 ! Cette année était très (trop ?) axé vers la solution de Cloud Computing de Microsoft, j’ai nommé Azure.
Voici la liste des sessions auxquelles j’ai assistées :
  • Améliorer les performances web : les optimisations côté client (la présentation était super intéressante (non spécifique .NET) et est disponible ici)
  • Développer des interfaces réactives avec WPF4
  • Développer efficacement vos applications // en C#4. Cette session parle de la nouvelle librairie TPL (Task Parallel Library) afin de développer facilement en parallèle.
  • WCF Ria services de A à Z
  • Industrialiser le développement avec Silverlight 4 et RIA Services. Session très intéressante en terme d’industrialisation. Un framework basé sur ce retour d’expérience est en cours et semble très prometteur.
  • Booster votre productivité sous visual studio 2010
  • Accélérer vos développements web grâce aux frameworks, toolkits et application
  • Accessibilité du Web 2.0 avec HTML5 et Silverlight. Microsoft fait des efforts concernant les standards et l’accessibilité et ça fait plaisir. Ils sont sur la bonne voie !!

L’ensemble des sessions devrait être disponible d’ici peu en webcast.

WPF : Problème de sélection dans un combobox

Il peut vous arriver de vouloir afficher dans une combobox des informations provenant de plusieurs propriétés de vos objets.

Pour cela, vous utilisez surement un DataTemplate. Je me suis heurté à un problème lors de la mise en place de mon DataTemplate. En effet, si le texte n’est pas assez long, il m’était impossible de sélectionner une entrée de la combobox en cliquant après la fin de mon texte.

Voici la bonne technique pour ne pas avoir ce problème.

Imaginons une classe Person ayant 2 attributs LastName (Nom) et FirstName (Prénom). Nous voulons dans notre combobox concaténer le nom et le prénom de chaque personne.

Voici le code que j’utilise :

<DataTemplate x:Key="myComboboxTemplate">
    <DockPanel HorizontalAlignment="Stretch">
        <TextBlock DockPanel.Dock="Left" Text="{Binding LastName}"/>
        <TextBlock DockPanel.Dock="Left" xml:space="preserve" Text=" "/>
       <TextBlock DockPanel.Dock="Left" Text="{Binding FisrtName}"/>
   </DockPanel>
</DataTemplate>

Et voici comment utiliser le template :


<Combobox ItemTemplate="{StaticResource myComboboxTemplate}"
                  SelectedItem="{Binding SelectedPerson}"
                  ItemsSource="{Binding myPersonList}" />

Afin de pouvoir sélectionner une entrée de la combo box via le clavier, il faut rajouter les attributs suivant :

IsTextSearchEnabled="True" TextSearch.TextPath="LastName"