Requêtes HTTP lentes dans .NET

Dans un contexte d’une étude sur les performances d’une application web, j’ai remarqué des retards constants d’environ 200ms sur certains appels HTTP qui utilisaient une API externe.

L’application web et l’API étaient sur le même segment de réseau et donc la latence du réseau était hors de question.
De plus la cible API a précédemment fait l’objet de tests de charge jMeter et éprouvée pour gérer 1500req/s.

Ce qui était encore plus étrange dans cette situation, c’est que seules les requêtes POST présentaient ce retard de 200ms. Les requêtes GET étaient rapides comme prévu.

(suite…)


Quelles versions de Visual Studio pour vos APPs Windows Phone ?

Windows Phone 7.x, 8.0 et 8.1

Depuis avril 2014, Il existe 3 versions majeures de Windows Phone : 7.x, 8 et 8.1.

La version 8.1 permet de créer des applications Windows Phone 8.1 « classique » renommées 8.1-Silverlight (SL) et également les nouvelles applications « Universal Apps » qui pourront être partagées entre Windows 8.1 et Windows Phone 8.1.

La mutualisation du code était déjà partiellement possible avec les PCL (Portable Class Librairies). L’assemblie compilée est directement utilisable à la fois dans un projet Windows phone 7.x, Wp8 et Windows 8 par exemple.

Les « Universal Apps » permettent en plus de mutualiser une grande partie du code visuel.

Visual Studio 2013 permet donc à la fois de créer des PCL compatibles WP8, W8, WP8.1, W8.1 et utilisables à la fois dans des applications Windows Phone classiques, Windows 8.x dans des projets Universal Apps.

Mais là où ça se complique c’est que Visual Studio 2013 ne permet plus la compatibilité WP7.x.

Windows Phone 7.x représente encore en avril 2014 19% des utilisateurs de Windows Phone (cliquez sur l’image pour l’enquête complète de adduplex).

clip_image003_thumb

Il va falloir faire un choix.

Si vous voulez pouvoir créer une application pour Windows Phone 7.x, Visual Studio 2012 vous sera encore très utile pour créer la PCL compatible WP7 et WP8 ainsi que l’application en Windows Phone 7.x.

Synthèse

Le schéma ci dessous vous présente une synthèse des possibilités en fonction de la version de Visual Studio choisie.

De même en fonction des choix pris pour la construction des PCL, votre code pourra ou non être mutualisé entre un projet Windows phone 7 et un projet Windows phone 8.1.

(suite…)


Comment gérer les sites multilingues avec WordPress ?

Voici un retour d’expérience sur la construction d’un site multilingue avec WordPress.

Les avantages de la solution proposée permet de gérer plusieurs langues pour un même site.

Les avantages :

  • Grande liberté de traduction et de présentation des articles dans les différentes langues
  • Thème différent en fonction des Pays
  • Bon référencement des pages dans les différents pays

Etape 1 : Création d’un Mutli-Site WordPress

Il suffit d’ajouter la ligne suivante à votre fichier wp-config.php.

 

En retournant ensuite sur le tableau de bord, une option Activer le réseau apparaît dans le menu Outil.

Il n’y a plus qu’à suivre les indications.

Choisissez l’option par défaut des répertoires afin d’avoir des url du type www.monsite.com/fr/mapage.html

2 actions vous seront demandées :

  • Copier/Coller du code dans le fichier wp-config.php
  • Copier/Coller du code dans le fichier .htaccess

(suite…)


WPF, ListView d’images, MVVM et Drag and Drop… – Fin

Introduction

Les projets précédents ont été redécoupés afin de fournir 2 assemblies directement utilisable.

Pour ceux qui souhaitent ajouter rapidement un treeview d’images avec une gestion de Drag&Drop (Voir les 4 précédents chapitres ) voici les étapes de réalisation.

L’exemple suivant montre comment réaliser une application respectant l’architecture M-V-VM avec les briques Drag and Drop et Listview d’images

Application M-V-VM exemple avec Liste en arbre de type TreeView

Il vous faudra :

  1. Ajouter les assemblies
  2. Définir un objet possédant l’Interface IImageFile (et IParentItem si vous souhaiter des structures hiérarchiques)
  3. Définir un objet ViewModel dérivant de CustomImageFileViewModel si vous voulez gérer le DragAndDrop provenant d’applications externes
  4. Initialiser les images dans CollectionImageViewModel

Implémentation

Ajouts des assemblies

La première étape est de télécharger ou compiler les assemblies suivantes (à la fin de l’article) :

  • ImageFileListView : Contient la partie visuelle, le View Model et les interfaces du modèle à implémenter
  • DragDropManager : Contient les mécanismes de Drag and Drop qui pourront être appliqués sur la lise

Ajout de la liste dans la View

Pour ajouter la liste dans la View vous devez définir une référence dans le XAML à l’assemblie ImageFileListView.


(suite…)


WPF, ListView d’images, MVVM et Drag and Drop… – Partie 3

Introduction

Vu précédemment

Nous avons vu dans la première partie comment implémenter une liste de fichiers en WPF avec le pattern MVVM.

Dans la deuxième partie, nous avons vus comment optimiser l’interface utilisateur avec le VirtualizingStackPanel, le multi Thread, les animations d’attente WPF. Nous avons eu également un aperçu de la manipulation des images pour utiliser lorsqu’elles existent les informations EXIF ou encore une transformation classique de ces images.

Je vous propose de voir dans cette troisième partie :

  • La mise en cache des images (améliorons l’interface utilisateur encore un petit peu)
  • Le Drag and Drop avec une sélection multiple d’éléments

Optimisation avec mise en cache

Implémentation d’un système de cache

Le but est de garder les x dernières images déjà chargée afin d’éviter un rechargement permanent de ces images.

Pour cela nous mettons en place une liste partagée en appel static, ainsi que son verrou (nous sommes dans un environnement multi-thread) afin de garantir l’écriture correcte des données.

Puis nous implémentons la méthode static AddThumbnailInCache

 

La méthode teste si l’élément est présent. Si il est présent, l’élément est replacé à la fin de la liste.

Si le nombre d’éléments dépasse le maximum d’élément fixés dans le cache (maxThumbnailInCache), l’élément en haut (le plus ancien) est supprimé. (suite…)


WPF, ListView d’images, MVVM et Drag and Drop… – Partie 2 2

Introduction

Vu précédemment

Nous avons vu dans la première partie comment implémenter une liste de fichiers en WPF avec le pattern M-V-VM. Nous allons voir dans cette partie comment ajouter les vignettes images “Thumbnails” représentant les images miniatures de ces fichiers.

alt

L’exemple utilisé reprend l’application précédente (sans les vignettes) qui sera complétée au fur et à mesure.

Pour revoir la première partie :

WPF, ListView d’images, MVVM et Drag and Drop… – Partie 1

Ajout des vignettes

Le premier réflex est de modifier la partie View-Modèle pour exposer la lecture du fichier image. Nous avons besoin du nom de fichier complet avec le chemin sur le disque dur. Nous ajoutons pour cela une nouvelle classe ImageFileViewModel qui va hériter de FileViewModel. Cette classe va s’occuper uniquement de l’affichage des vignettes.

Ajout de ImageFileViewModel.cs dans le ViewModel

Il nous faut ensuite ajouter la propriété FileName dans la classe ImageFileViewModel. La propriété va renvoyer le nom complet de l’objet ImageFile contenu dans _imageFile.

ImageFileCollectionViewModel retourne désormais une collection d’objet ImageFileViewModel.

 

 

Puis dans la partie View, nous ajoutons l’image dans le UserControl ImageFileListView.xaml

Ajout de l'image dans ImageFileListView

Le Binding est fait sur la propriété Source de l’Image avec {Path=FileName}

Nous pouvons lancer l’application qui fonctionne…

Premier résultat catastrophique

et pleurer… SmileyCry parce que c’est très Lennnnnt…

(suite…)


WPF, ListView d’images, MVVM et Drag and Drop… – Partie 1

Introduction

Pour les besoins d’un logiciel orienté « Photos », j’ai eu besoin des fonctionnalités essentielles suivantes :

  • Affichage des images sous forme de vignettes dans une liste et dans une arborescence de type TreeView
  • Cet affichage doit permettre de gérer un nombre imposant de photos (>5000 !) sans générer de débordement mémoire ou de ralentissement
  • L’affichage et la génération des vignettes doit pouvoir se faire en mode asynchrone (en lisant les informations EXIF si elles existent,…)
  • La multi-sélection doit permettre de sélectionner plusieurs éléments.
  • Les éléments sélectionnés doivent pouvoir être déplacés ou copiés dans la liste (ou l’arbre) par Drag And Drop

Et le tout en DotNet WPF respectant le pattern MVVM !!!

MVVM Pattern

Je ne ferai pas un gros article sur la nécessité de développer en WPF selon une architecture MVVM (Séparation des fonctions, réutilisation, rôle des objets mieux ciblés, accès déclaratifs…). Voici quelques liens au cas où vous ne seriez toujours pas convaincus…

http://www.orbifold.net/default/?p=550
http://japf.developpez.com/tutoriels/dotnet/mvvm-pour-des-applications-wpf-bien-architecturees-et-testables/
http://msdn.microsoft.com/fr-fr/magazine/dd419663.aspx
http://www.c2i.fr/Article/Detail/a3809f7b-196a-4d8c-bb48-164f591920bb

MVVM et ListView

Cette première partie présente l’implémentation de la liste d’images avec le modèle MVVM.

Exemple d’application

Voici le descriptif fonctionnel de l’exemple que nous allons mettre en place : Un petit croquis vaut mieux qu’un long discours.

Draft MVVM application

L’application est extrêmement simpliste. La saisie d’un répertoire se fait en haut, le click sur le bouton affiche la liste des images et leur nombre total.

Découpage de l’application

L’application est découpée en 4 parties :

  • Model : l’objet “métier” image
  • ViewModel : les objets nécessaires à la manipulation des objets “Model” images par la couche “View” (Détail de l’image et liste des images)
  • View : L’affichage XAML-WPF de la liste des images
  • Controler : Les actions nécessaires : Remplissage de la liste par exemple

(suite…)


Exemple de projet MVC (mis à jour)

J’ai mis à jour le projet MVC échantillon que j’ai écrit pour l’utilisation d’ASP.NET MVC 3 et le moteur d’affichage Razor.

Un changement mineur, c’est que je n’utilise plus le FluentValidationModelValidatorProvider mais le standard. Donc j’ai décorer le modèle d’affichage avec les annotations de données nécessaires :

 

(suite…)


Comment convertir en C# un XHTML en PDF

Dans cet article, je vais illustrer comment vous pouvez convertir une page XHTML en PDF à l’aide de la bibliothèque de flying-saucer . Il s’agit d’une librairie Java et nous devons donc la convertir vers une assemblie .NET.

Je vais utiliser le compilateur Bytecode IKVM.NET (ikvmc.exe) à cet effet. Alors allez-y et téléchargez la bibliothèque flying-saucer et le projet IKVM.

Puis exécutez la commande suivante :

(suite…)


Quelles fonctionnalités aimeriez-vous voir dans ASP.NET MVC 4 ?

S’il y avait une seule fonction que je voudrais voir dans ASP.NET MVC 4, ce serait de voir supprimer/déprécier les ViewBag et ViewData.
Ces deux concepts conduisent à du code très laid selon mon point de vue.
Voici ce que je déteste le plus dans les ViewBag et ViewData :
  • Ils ne sont pas fortement typés et vous devez effectuer un Cast dans vos vues afin d’obtenir le type réel
  • Ils ne sont pas refactorisables car ils s’appuient sur les « magic strings »
  • Ils conduisent à des tests unitaires fragiles en raison des « magic strings »
  • Ils conduisent au code spaghetti dans les vues

Voici le patch de diff, que je serais ravi de voir appliqué pour la classe ViewDataDictionary.cs dans ASP.NET MVC 4 :

Et vous qu’en pensez-vous ?

Upload de plusieurs fichiers avec c#

Avez-vous déjà été dans une situation où vous avez besoin pour télécharger plusieurs fichiers à un hôte distant et passer des paramètres supplémentaires dans la requête ? Malheureusement il n’y a rien dans la BCL qui nous permet d’atteindre cet objectif hors de la boîte.

Nous avons la méthode UploadFile , mais il est limité à un seul fichier et ne nous permet pas de passer des paramètres supplémentaires. Alors allons-y et écrire de telle méthode. L’élément important est que cette méthode doit être conforme RFC 1867 afin que le serveur web distant peut analyser correctement les informations.

Tout d’abord, nous définissons un modèle représentant un seul fichier à télécharger :


(suite…)


LINQ to XML et la lecture des très gros fichiers

LINQ to XML est relativement facile à implémenter pour lire de gros fichiers et pour requêter des fichiers XML.
Par exemple, considérons ce fichier XML :

Supposons que vous souhaitez trouver tous les enregistrements avec groupid > 2. Vous pouvez être tenté d’implémenter la requête suivante :

Il y a un piège dans cette implémentation. La méthode XElement.Load va lire tout le fichier XML en mémoire avant de s’exécuter, et ce fichier peut être très gros.

(suite…)


Méthodes dynamiques (classe DynamicMethod) en .NET

Utiliser la réflexion pour invoquer des méthodes non connues à la compilation peut être problématique en terme de performances dans des applications critiques. L’exécution de ces méthodes est environ 2,5 à 3 fois plus lente qu’un appel directe.
Voici un exemple :

Et voici les résultats :

Type d’accès unités CPU
Invocation par accès directe 796
Invocation par Réflexion 1986

Ainsi, l’utilisation de la réflexion pour lire une propriété est 2,5 fois plus lente que l’accès directe à cette propriété.

Les méthodes dynamiques peuvent être utilisées pour générer et exécuter une méthode à l’exécution sans devoir déclarer une assemblie dynamique et un type dynamique qui contiendront la méthode. Elles représentent un moyen plus efficace pour générer et exécuter ce type de code.

(suite…)


Transactional NTFS (partie 1/2)

Transactional NTFS et DotNet

Microsoft introduit un concept intéressant à partir des versions de Windows Vista et Server 2008.
Cette nouveauté est appelée Transactional NTFS (TxF).
Elle permet aux développeurs d’écrire des fonctions d’Entrée/Sortie garantissant le succès complet ou le rejet complet en cas d’erreur d’un ensemble d’opérations.

Malheureusement il n’existe pas de classe DotNet(au moins jusqu’à la version 3.5 SP1) permettant de manipuler simplement ce type d’opérations.

Pour manipuler ces opérations, nous avons besoin de passer par le P/Invoke pour utiliser ces fonctions :

CreateTransaction, CommitTransaction, RollbackTransaction et DeleteFileTransacted

(suite…)


Comment nous faisons de l’ASP.NET MVC

Sample MVC Solution

In this post I will show a sample ASP.NET MVC 2.0 project structure illustrating different concepts such as data access, user input validation and mapping between the domain and the view model. The project is still under construction but the source code is available at github.

I will illustrate the usage of the following frameworks:

  • MvcContrib bringing useful extension methods and strongly typed helpers to ASP.NET MVC
  • AutoMapper enabling easy mapping between the domain and the view models
  • FluentValidation – a small validation library for .NET that uses a fluent interface and lambda expressions for building validation rules for your business objects
  • NHibernate – a popular ORM in the .NET world
  • FluentNHibernate – a statically compiled alternative to NHibernate’s standard hbm xml mapping
  • Spring.NET – object container and dependency Injection framework for .NET
  • Rhino.Mocks – A dynamic mock object framework for the .Net platform. It’s purpose is to ease testing by allowing the developer to create mock implementations of custom objects and verify the interactions using unit testing

 

Armed with this arsenal of frameworks let’s start exploring the solution structure. I’ve opted for 2 projects solution but in many real world applications more levels of abstraction could be brought to the business layer. Personally I favor to have less big assemblies rather than many small assemblies into the solution. Fewer the assemblies, faster the load time and faster the IDE. In this case particular attention should be brought to bring proper separation of concerns inside the same assembly

 

ASP.Net MVC project structure

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

(suite…)


Jouer avec FindFirstFile et FindNextFile

Énumération des fichiers dans .NET est facile. Tout le monde connaît la méthode GetFiles et vous pouvez être tenté d’écrire du code comme ceci :

Mais si vous regardez de plus près, vous remarquerez que cette méthode retourne un tableau de chaînes. Cela pourrait être problématique si le répertoire que vous recherchez contient beaucoup de fichiers. La méthode se bloque jusqu’à ce qu’il effectue une recherche et une fois qu’il termine il va charger tous les résultats dans la mémoire. Il serait beaucoup mieux si il vient de rentrer un IEnumerable. C’est exactement ce que la méthode EnumerateFiles dans .NET 4.0. Malheureusement dans .NET 3.5 il n’y a rien pour le travail.

Dans ce post, je vais montrer comment implémenter cette fonctionnalité en utilisant les fonctions FindFirstFile et FindNextFile .

(suite…)


Manipulations de matrices avec du code non sécurisé

La classe Matrix

Dans cet article nous allons comparer 2 méthodes qui traitent de multiplication de matrices en .Net | C#.

Nous commençons par la définition de la classe matrice :  Matrix

Multiplications de matrices

Voici le premier algorithme de multiplication de matrice qui réalise l’opération de manière standard.

Voici le second algorithme qui réalise la même chose, mais cette fois en utilisant du code non sécurisé (unsafe)

(suite…)