mardi 17 juillet 2012

Client WCF à partir de l'interface .NET - le ChannelFactory

Souvent, pour réaliser un client sur un service WCF, on passe par une "Service Reference". Ce type de référence, va générer du code(Visual Studio) et notamment un client qui implémente une interface compatible avec l'interface du service. Après génération de ce code, si vous regarder votre code, vous trouverez d'une part l'interface au niveau de votre service et d'autre part l'interface générée gentiment par Visual Studio. Les datacontracts utilisés par votre service seront également dupliqués du coté du client.

L'avantage de cette solution est sa facilité de mise en place et l'indépendance du client par rapport au service. Le désavantage est cette duplication du code. Si vous êtes détenteur du code du service et donc de ses contrats, pourquoi ne pas directement utiliser ces contrats au lieu d'en régénérer dans votre assembly cliente ? Pour éviter cette duplication, il est possible de créer un client wcf à partir du contrat via la classe System.ServiceModel.ChannelFactory. Comment utiliser ce ChannelFactory ?

Pour voir le fonctionnement, nous allons faire une petite solution visual studio qui comprendra:
  • Un assembly avec l'interface du service(Contracts)
  • Un assembly avec l'implémentation du service(Services) - reférence Contracts
  • Un host pour le service (SVCHost) - référence Services et Contracts
  • Une console qui sera client du service (ConsoleClient) - référence Contracts
N'oubliez pas d'ajouter les références vers System.ServiceModel et System.Runtime.Serialization sur vos projets. Vous devriez alors avoir quelque chose comme :
Voici le code des différents composants :

Le code du host (hello.svc)
 Le code du client
Comme nous pouvons le voir ici, il n'y a pas de code généré. Le client référence simplement l'assembly contenant les interfaces et WCF va nous généré un client au travers de la classe ChannelFactory.

Le gros avantage est que si vous modifier votre interface, vous pouvez directement voir les impacts. Cette solution ne fonctionne néanmoins que dans un système fermé (entièrement sous contrôle d'une seule entité). Si vos services sont ouverts, vous ne pouvez pas fournir forcément fournir votre assembly de contrats. Dans ce cas la, une service reference s'impose !

Sources :

mardi 10 juillet 2012

Définir les styles par défaut dans Word

Certaines configuration de Word ne montre pas les styles que vous utilisez le plus souvent. Dans mon cas, je suis tombé sur une machine ou Word ne me proposait pas les styles Titre1,Titre2,Titre3 ou Heading1, Heading2, Heading3 si votre MS Office est en anglais.


Alors comment faire pour configurer son bandeau ? Pour les styles, voici la procédure à suivre :
  • Afficher la fenetre des styles (ctrl+alt+shift+s ou cliquer sur la petite flèche de la boite des style comme montré sur l'image ci dessous
  •  Afficher la boite de dialogue Manage Styles
  •  A partir de cette fenêtre, dans l'onglet Recommend, vous pouvez définir les styles à afficher par défaut (Show), à cacher (Hide) ou à cacher tant qu'il n'est pas utilisé (Hide until used)


  • Enfin, vous avez la possibilité de préciser que vous souhaiter garder la configuration pour votre document ou pour tous les documents qui ont le même template

mardi 3 juillet 2012

A socket operation encountered a dead network

Ce matin, en voulant me connecter à ma base de données Oracle locale via un projet Console C# avec devart dotConnect for Oracle

connection = new OracleConnection(ConfigurationManager.ConnectionStrings["XE"].ConnectionString);
 
voici le joli message d'erreur que j'ai obtenu :

Network error:: 10050 - A socket operation encountered a dead network < Host = 127.0.0.1:1521>

Un tnsping vers ma base de données m'indique que la base de données est joignable et que le problème vient donc de l'application .Net. Après de nombreuses recherches je tombe sur une discussion qui indique que cela peut venir du "Firewall Client for ISA Server". Après désactivation de ce process, j'obtiens le message suivant :

Socket error "An invalid argument was supplied"
Network error:: 10022 - An invalid argument was supplied < Host = 127.0.0.1:1521>

Alors que je perséverais dans mes recherches, je me suis souvenu que mes projets C# avait été déplacé sur un disque réseau ... Pour ceux qui ne le saurait pas, Windows n'autorise pas à une application se situant sur un disque réseau(qui n'est pas configuré comme étant un "disque de confiance") à effectuer des connections réseaux ...

L'une des solutions pour régler ce problème consiste donc simplement à déplacer votre exécutable sur votre disque local. Ces messages peuvent provenir d'autres problèmes sur votre machine mais avant de chercher trop loin vérifiez que votre application ne se trouve pas sur un disque réseau !

mercredi 20 juin 2012

Oracle Execute Immediate : Nom de table invalide (ORA-00903: Invalid table name)

Si vous avez cette erreur c'est que comme moi vous avez tenté de faire quelque chose comme :

Begin
  Execute Immediate 'Truncate Table :1' using 'MaTable';
End;

En y réfléchissant bien, il est normal qu'Oracle refuse de faire cela. En effet, la commande Execute Immediate travaille avec des bind variables (préfixées par un ':'). La valeur d'une bind variable est assignée après que le parseur ait analysé votre requête. Oracle vous indique donc que la table ":1" n'existe pas.

Pour info, si vous travaillez avec sqlplus et que vous pouvez scripter le code que vous souhaitiez exécuter, il est possible d'avoir le comportement que vous souhaitiez en utilisant une variable de script, c'est à dire &1 :

Begin
   Execute Immediate 'Truncate Table &1';
End;
/

Si sqlplus n'est pas une solution, vous devez concaténer votre requête dynamique :

Begin
  Execute Immediate 'Truncate Table ' || 'MaTable';
End;

mardi 12 juin 2012

2 fenêtres Excel indépendantes en dual screen

Voici une petite astuce assez simple qui permet d'avoir 2 instances d'Excel indépendantes.

Si vous tentez d'ouvrir 2 fichiers Excel différents vous remarquerez qu'il n'y a qu'une seule instance d'Excel qui est ouverte contenant 2 sous fenêtres avec vos documents. Afin de pouvoir splitter votre Excel, il suffit de lancer 2 instances d'Excel sans spécifier de fichier puis de récupérer le fichier sur l'instance souhaitée.

En gros:
  1. Fermez toutes les instances d'Excel ouvertes
  2. Allez dans le menu démarrer (ou dans la barre des tâches) et lancez Excel
  3. Disposez la fenêtre sur l'écran voulu
  4. Répétez l'étape 2 pour ouvrir une nouvelle instance d'Excel indépendante.
Voila une procédure assez simple, mais la question me revient souvent, donc je l'inscris ici :-)

 Solution testée avec MS Excel 2007 SP3 et MS Excel 2010

lundi 4 juin 2012

Un aperçu de Html5

Voici le lien vers une présentation (en html) que j'ai réalisée à propos de Html5 lors d'un workshop dans la société pour laquelle je travaille :
Présentation : Un aperçu de Html5

Je présente les points suivants :
  1. Introduction à Html 5
  2. Nouveaux Eléments Sémantiques
  3. Formulaire
  4. Multimédia
  5. Stockage
  6. Dessins
  7. Géolocalisation
Chaque partie présente quelques exemples.

Cette présentation utilise la librairie slidy2.js (http://www.w3.org/Talks/Tools/Slidy2/#%281%29) qui est utilisée pour les présentation du W3C. Les exemples de la présentation fonctionnent tous avec Opera 11.64

lundi 30 avril 2012

Détection de modifications sur un fichier ou un dossier: Le FileWatcher

Sur les systèmes Windows, il est possible de récupérer des évenements liés au système de fichier tel que la création d'un fichier, sa modification, sa suppression, ...

Le framework .Net fourni une classe, le FileSystemWatcher, qui permet de récupérer ces événements. Cette classe peut-être utilisée pour, par exemple, récupérer l'événement de modification d'un fichier de configuration afin de le recharger sans devoir redémarrer l'application concernée. Le FileSystemWatcher peut récupérer les évenements liés à un dossier et ses sous-dossiers ou un fichier déterminé.

Les principales propriétés définissant le watcher sont les suivantes :
  • Filter (string) : Permet de filtrer les fichiers par extensions. Utilise les wildchars (exemple *.xml pour les fichiers avec l'extension xml). Si on specifie un nom de fichier les évenements ne seront déclenchés que pour ce fichier.
  • IncludeSubdirectories (bool) : Permet d'inclure ou non les sous dossier du dossier défini dans la propriété Path
  • NotifyFilter (enum NotifyFilters) : Permet de filtrer les évenements qui doivent déclencher le watcher.
  • Path (string) : Le chemin du dossier sur lequel il faut écouter les évenements.
  • EnableRaisingEvents (bool) : Démarre ou arrête le déclenchement des évenements par le watcher
  • InternalBufferSize (int) : la taille du buffer contenant les évenements non encore traité. Une taille trop faible risque de provoquer de nombreux dépassements. La taille par défaut est de 8192.
Et les évenements écoutables sont :
  • Changed : Un fichier ou un dossier a été modifé
  • Created : Un fichier ou un dossier a été créé
  • Deleted : Un fichier ou un dossier a été supprimé
  • Renamed : Un fichier ou un dossier a été renommé
  • Error : La limite du buffer du watcher a été dépassée
Voici un petit exemple permettant d'afficher dans une console si un fichier a été modifié :
Et voici le handler de l'évenement :


En fonction de l'éditeur que vous utilisez, il est possible que 2 évenements soient déclenchés lorsque vous sauvez votre fichier. Il existe plusieurs solutions permettant de résoudre ce problème (je vous invite à lire la source 3). Celle que je vous propose ici consiste à déterminer la date de dernière modification du fichier et de voir si le second évenement n'a pas été déclenché en même temps. Je stocke donc la date de dernière modification dans une variable et je la teste avant de réaliser la tâche à faire :
Ainsi, l'évenement ne sera déclenché qu'une seule fois.

La documentation de la MSDN (source 1) est, comme d'habitude, très explicite, n'hésitez donc pas à y jeter un oeil pour en savoir plus.

Sources :
  1. http://msdn.microsoft.com/en-us/library/system.io.filesystemwatcher.aspx
  2. http://weblogs.asp.net/ashben/archive/2003/10/14/31773.aspx
  3. http://stackoverflow.com/questions/1764809/filesystemwatcher-changed-event-is-raised-twice