[NetFx3] Présentation du Windows Communication Foundation (WCF)

Mercredi 8 novembre 2006

Résumé:
WCF pour Windows Communication Foundation est l’une de quatre nouvelles briques apportées par .NET Framework 3.0. Cette brique unifie le développement des applications distribuées. Cet article présentera les bases de cette plateforme avec un exemple concret d’application en mode de client-service.

Sommaire:

   * Introduction
    * 1 Présentation du WCF
          o    1.1 Présentation
          o    1.2 Installation
    * 2 Fonctionnement et l'ABC du WCF
          o     2.1 Presentation
          o     2.2 Les EndPoints : l'ABC du WCF
    * 3 Développer avec WCF
          o     3.1 Création du service
          o     3.2 Création de l'host (partie serveur)
          o     3.3 Création du client
    * 4 Demo : Développer un mini service d'annuaire
          o     4.1 Création du service MonPremierServiceWCF
          o     4.2 Création de l'host MaPremiereHostWCF
          o     4.3 Création du client MonPremierClientWCF
          o     4.4 Conclusion
    * 5 Aller plus loin dans WCF
          o     5.1 IsOneWay et CallbackContract
          o     5.2 Gestion des sessions
          o     5.3 Gestion de la sécurité
    * Conclusion

Pour ceux qui serait intéressé :

[MS] Ca bouge la haut : l’arrivée en masse des RTM

Mardi 7 novembre 2006

Belle journée en perspective (encore faudrait il que j’arrive à finir mon article français/anglais sur WCF :) ) avec la sortie en version RTM* du .NET Framework 3.0 et du Windows SDK for Vista.

Toujours dans les news, notez la sortie du Microsoft ASP.NET AJAX Extention (ex-Atlas) en version Beta 2 ainsi que les sorties RTM d’Office 2007 et des VSTO (Visual Studio Tools for Office).

Les liens :

Bref pour une première semaine de Novembre ça promet, en attendant les feedbacks du Tech-Ed !! Tous à vos downloads :)

UPDATE du 09/11/2006:
Les oublies :

* : (RTM = Release To Manufacturing)

[WPF] S’amuser avec le MediaElement sous WPF

Samedi 21 octobre 2006

Le contrôle MediaElement que j’ai decouvert au cours de cette semaine a revolutionné ma petite vie de developpeur :) Ce contrôle permet de contenir des images, sons ou videos.
Pour charger un media, rien de plus simple :

1
2
MediaElement monMedia = new MediaElement();
monMedia.Source = new Uri("monURI");

Sachant que mon Uri peut pointer sur un fichier local (c:\….) ou distant (http://…..) que se soit une video, une image ou un son….

Le media sera joué immédiatement. Bien que vous disposez des methodes Play(), Stop() et Pause() pour contrôler le media, utilisez plutot la proprieté LoadedBehavior qui permet de definir et/ou obtenir l’etat du media :

1
2
3
monMedia.LoadedBehavior = MediaState.Pause; //Pause
monMedia.LoadedBehavior = MediaState.Stop; //Arret
monMedia.LoadedBehavior = MediaState.Play; //Play

A ce sujet, pour pouvoir jouer une video (ou son) en boucle, la seule doc que j’avais trouvé sur le msdn2 était de mettre un MediaTimeline. Chose un peu tordu dans le code alors qu’il y a une solution toute simple :
1) Abonnez-vous à l’evenement MediaEnded (fin du media) :

1
2
monMedia.MediaEnded +=
          new RoutedEventHandler(monMedia_MediaEnded);

2) Remettez la position du media à zero (debut) et relancez le media :

1
2
3
4
5
void monMedia_MediaEnded(object sender, RoutedEventArgs e) {
     ((MediaElement)sender).LoadedBehavior = MediaState.Stop;
     ((MediaElement)sender).Position = new TimeSpan(0);
     ((MediaElement)sender).LoadedBehavior = MediaState.Play;
}

Ce qui est quand même beaucoup plus simple :)

C’est bien beau tout ca, mais la vous n’avez aucun apercu à l’ecran ce qui est quand meme un peu dommage ^^ Mais là où ca devient fort bien interressant, c’est qu’un VisualBrush peut prendre en parametre un MediaElement pour pouvoir remplir un rectangle par exemple :

1
2
Rectangle monRectangle = new Rectangle();
monRectangle.Fill = new VisualBrush(monMedia);

Et hop la, votre video (par exemple) sera joué dans ce rectangle. Enfin pour rajouter votre rectangle à un canvas que vous aurez au préalable placé dans votre code XAML :

1
monCanvas.Children.Add(monRectangle);

A partir de la on peut vraiement s’amuser et aller plus loin dans la démarche.. Par exemple, les rectangles ont une proprieté Clip qui va nous permettre de clipper notre media, OpacityMask pour appliquer un masque d’opacité, et bien d’autre chose pour appliquer differents effets a notre rectangle/video, … Et encore je ne parle que des rectangles, a partir du moment où votre controle pourra etre remplit par un VisualBrush on pourra tout y mettre :)
Je ne vais pas vous devoiler sur ce quoi je travaille en ce moment, mais il faut bien se rendre compte de tout ce qu’on peut faire avec car c’est carrement dément…

[WPF] Z-Index dans WPF

Jeudi 12 octobre 2006

Tout comme en CSS, on retrouve une notion de ZIndex en WPF, qui permet de spécifier l’empilement des différents calques.

Sous WPF, les ZIndex s’appliquent uniquement sur des objets ‘conteneurs’ comme les Panels, Grid, StackPanels et Canvas.

En XAML, la syntaxe est :

1
2
3
4
<Canvas>
    <Image Name="Image1" Canvas.ZIndex="2" Height="60" Width="60" Source="test1.png" />
    <Image Name="Image2" Canvas.ZIndex="1" Height="50" Width="70" Source="test2.png" />
</Canvas>

Ici, l’image 1 se trouvera au dessus de l’image 2. On remarque l’ attribut Canvas.ZIndex placé dans la balise Image.

Dans le code, ici en C#, cela se déclare de cette manière :

1
2
Canvas.SetZIndex(Image1, 2);
Canvas.SetZIndex(Image2, 1);

Vous avez aussi la possibilité de récupérer la proprièté ZIndex d’un element par :

1
int image1_ZIndex = Canvas.GetZIndex(Image1)

Persistance&Tracking avec Workflow Foundation

Dimanche 6 août 2006

Windows Workflow Foundation propose deux services fort utile qui sont le Tracking et la Persistance.

La persistance va permettre d’enregistrer l’instance d’un workflow en dur dans un serveur SQL. On va pouvoir grace a cela, demarrer une instance de workflow depuis une application host, la quitter, puis la reprendre a tout moment. La persistance devient alors très utile, imaginez un workflow de gestion d’article qui demarre au moment où un article serait posté et attendrait la validation des admins pour etre publié. Il serait alors fort utile de pouvoir enregistrer et reprendre le workflow quand on le souhaite pour que les admins puissent donner leur reponse à tout moment.

La persistance sous WF est très simple a mettre en oeuvre :
Il faut d’abord préparer la base de données en executant les scripts SQL qui se trouvent dans C:\WINDOWS\WinFX\v3.0\Windows Workflow Foundation\SQL\EN. Il y a 4fichiers : 2 pour les schémas et 2 pour la logique pour la persistance et le tracking. Executez les schémas en 1er biensûr :)
Ensuite pour activer la persistance dans votre workflow, ajoutez le service SqlWorkflowPersistenceService à votre runtime. ex:

1
Dim persistance As New SqlWorkflowPersistenceService(CONNSTRING, True, New TimeSpan(0, 0, 5), New TimeSpan(0, 0, 5) runtime.AddService(persistance)

A tout moment vous allez pouvoir recuperer les instances persistées par le code :

1
Dim instances As IEnumerable(Of SqlPersistenceWorkflowInstanceDescription) = persistance.GetAllWorkflows()

Vous recuperez une collection de SqlPersistenceWorkflowInstanceDescription où vous allez pouvoir recuperer des informations comme son status, son ID d’instance, etc…
Enfin pour récupérer une instance :

1
Dim instance as WorkflowInstance = runtime.GetWorkflow(_instanceID)

_instanceID est un Guid qui correspond à l’ID de l’instance à resumer.

Le Tracking quant à lui, permet de « traquer » un workflow en enregistrant des tas de parametres sur son déroulement. Pour le mettre en place, c’est aussi facile que pour la persistance. Assurez-vous d’avoir bien créé les tables (scripts Tracking_Logic et Tracking_Shema). Ensuite tout comme la persistance, il faudra ajouter le service tracking à la runtime par le code :

1
Dim tracking As New SqlTrackingService(CONNSTRING) runtime.AddService(tracking)

Vous pourrez ensuite recuperer un tas de parametres pour toutes les instances par le code :

1
2
Dim stq As New SqlTrackingQuery(CONNSTRING)
Return stq.GetWorkflows(New SqlTrackingQueryOptions())

Ce code vous retournera une List(Of SqlTrackingWorkflowInstance) (autopub: explication des List ici) :) )

L’objet SqlTrackingQueryOptions permet quant à lui, d’imposer des conditions de recherche. L’exemple ci-dessous permet de recuperer seulement les instances en cours (running) :

1
2
3
4
Dim stq As New SqlTrackingQuery(CONNSTRING)
Dim opt As New SqlTrackingQueryOptions()
opt.WorkflowStatus = WorkflowStatus.Running
Return stq.GetWorkflows(opt)

L’objet SqlTrackingWorkflowInstance contient toutes les informations sur une instance de Workflow. On y trouve les propriètés ActivityEvents (evenement des Activity), Status, UserEvents (evenement des utilisateurs comme par exemple les traces laissées par les TrackData dans le workflow), WorkflowInstanceId, etc…

Toutes les specs du SqlTrackingWorkflowInstance : http://windowssdk.msdn.microsoft.com/en-us/lib…

Conclusion : ca devient un vrai jeu d’enfant, sous WF, de persister et tracer un workflow. Moi j’adore :)