Trucs et astuces pour Visual Studio 2008 / Visual Basic 2008 / Visual C# 2008 : Partie 5
Sommaire de la cinquième partie
Exposez votre couche métier au travers d’un projet de type Web Service | |
Rendez vos objets sérialisables et exposez-les sous forme de Web Service | |
Exploitez la nouvelle interface de découverte des Web Services | |
Répercutez la gestion d’authentification d’une application de type Webform vers une application Winform | |
Exploitez la gestion des rôles hérités d’une application Web dans une application Winform | |
Quelques derniers trucs-astuces |
<< Retour à la quatrième partie
|
Partie 5 : les Web Services, les Webform et les Winform
Exposez votre couche métier au travers d’un projet de type Web Service |
Ajoutez un projet de type Web Service à votre solution, supprimez tout élément de type *.svc ainsi que les fichiers de dépendance. Cela nous permet ainsi de créer notre contenu depuis zéro et nous garantie un fonctionnement ad-doc.
Référencez votre projet de type librairie de classe contenant la logique métier et ajoutez un nouvel item de type *.svc en le nommant : « EmployeeService.svc ».
Vous constatez l’apparition des éléments suivants :
Effectivement, de manière naturelle, nous retrouverons derrière tout web service deux éléments que sont l’interface de communication en vue de déterminer le contrat de tout web service ainsi que la classe attachée implémentant l’interface en question.
Voici le code à implémenter au sein de l’interface :
Imports System.ServiceModelImports EmployeLibImports System.Collections.Generic' NOTE: If you change the class name "IServiceEmploye" here, you must also update the reference to "IServiceEmploye" in Web.config.<ServiceContract()> _Public Interface IServiceEmploye '<OperationContract()> _ 'Sub DoWork() <OperationContract()> _ Function EmployeList() As List(Of Employe)End Interface
Et le code inhérent à la classe :
Public Class ServiceEmploye Implements IServiceEmploye 'Public Sub DoWork() Implements IServiceEmploye.DoWork 'End Sub Public Function EmployeList() As System.Collections.Generic. _ List(Of EmployeLib.Employe) _ Implements IServiceEmploye.EmployeList Return EmployeLib.EmployeMgr.EmployeList End FunctionEnd Class
Cette étape terminée, il ne nous reste qu’à consommer le service. Tentons préalablement de consommer ce web service au sein d’un navigateur. Pour cela, compilez le web service et faites un clic droit en demande à voir le fichier de type *.svc que nous venons de créer dans un navigateur. Vous obtenez logiquement une erreur sécurité puisque notre service WCF tente logiquement de se connecter avec un mode par défaut, ce qui ne convient pas dans le cas présent. Afin de corriger cela, rien de plus simple, rendez-vous dans le web.config et plus particulièrement dans la partie « behaviour » du web service et adaptez includeExceptionDetailInFaults à True comme dans le code ci-dessous :
<system.serviceModel> <services> <service behaviorConfiguration="ServiceEmployeBehavior" name="ServiceEmploye"> <endpoint address="" binding="wsHttpBinding" contract="IServiceEmploye"> <identity> <dns value="localhost" /> </identity> </endpoint> <endpoint address="mex" binding="mexHttpBinding" contract="IMetadataExchange" /> </service> </services> <behaviors> <serviceBehaviors> <behavior name="ServiceEmployeBehavior"> <serviceMetadata httpGetEnabled="true" /> <serviceDebug includeExceptionDetailInFaults="true" /> </behavior> </serviceBehaviors> </behaviors></system.serviceModel>
Cette étape nous permettra d’afficher le résultat du détail de l’exception dans l’interface de débug ; Internet Explorer, dans notre cas.
Haut de page
Rendez vos objets sérialisables et exposez-les sous forme de Web Service |
Une nouvelle compilation du projet Web Service et l’affichage du *.svc dans Internet Explorer nous permettra de constater une problématique de sérialisation de nos objets métiers de type Employe.
Revenons ainsi quelques instants sur la classe Employe de notre librairie de classe et adaptons le code comme suit :
<Serializable()> _<DebuggerDisplay("Nom = {Nom}")> _ Public Class Employe
Comme vous pouvez le remarquer ici, nous avons ajouté l’attribut Serializable permettant ainsi de déclarer explicitement au compilateur la nécessité de rendre cette classe sérialisable.
Cette opération effectuée, compilez à nouveau votre projet et constatez le résultat, tout semble maintenant répondre à nos attentes et nous pouvons ainsi poursuivre le développement de la solution complète en adaptant la consommation de la logique métier par le projet Winform.
Haut de page
Exploitez la nouvelle interface de découverte des Web Services |
Ajoutons ainsi une référence Web (EmployeeService) à la solution Winform initiale permettant de créer le proxy local et consommons le Web Service en question.
Lors de cet ajout, vous aurez certainement remarqué la nouvelle interface de gestion d’ajout de référence Web et plus particulièrement la capacité d’auto-découverte des Web Services intégrés à votre solution.
Cliquez sur « Discover / Services in Solution », vous retrouverez ainsi directement le Web Service construit préalablement et il ne vous restera plus qu’à le sélectionner ainsi qu’à définir son NameSpace.
Il vous reste à adapter le code de votre formulaire « Form1 » comme suit :
Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load Dim serviceProxy As New ServiceEmploye.ServiceEmployeClient empList = serviceProxy.EmployeList ListBox1.Items.AddRange(empList.ToArray)End Sub
Et ainsi constater le résultat qui se justifie à nouveau par une Erreur de Sérialisation. Effectivement, bien que la sérialisation se déroule bien au niveau du Web Service, le type initial de nos données ne sera pas automatiquement répercuté dans notre solution Winform. Afin de corriger ceci, Visual Studio 2008 met à notre disposition une nouvelle fonctionnalité d’interprétation des données récupérées depuis un Web Service. Fonctionnalité à laquelle vous pouvez accéder au travers du bouton « Avancé… » (Advanced…) de la fenêtre d’ajout de Référence de Web Service.
Pour ce faire, modifiez le Collection Type du Data Type de System.Array en System.Collections.Generic.List
Haut de page
Répercutez la gestion d’authentification d’une application de type Webform vers une application Winform |
Une nouvelle compilation nous permettra de détecter un nouveau type d’erreur du fait de la tentative d’exploitation de l’authentification au travers de l’exploitation en remote. Une légère adaptation du code du fichier Web.Config permettra de pallier cette dernière problématique et nous laisser ainsi avancer dans le débugging et le développement de notre solution finale.
Ajoutez ainsi la structure XML suivante :
<system.web.extensions> <scripting> <webServices> <authenticationService enabled="true" requireSSL="false"/> <roleService enabled="true"/> </webServices> </scripting></system.web.extensions>
Et adaptez le nœud suivant :
<authentication mode="Forms" />
Maintenant que nous avons géré ceci côté application WCF, nous devons impérativement mentionner à l’application Winform que celle-ci doit répercuter l’authentification du Web Service, qui se comporte ici comme une application Web.
Chargez ainsi l’interface de gestion « MyProject » et cliquez sur la partie relative aux Services. Passez l’option « Enable Client Application Services » à True vous permetta de saisir les informations relatives à l’authentification comme présenté dans la capture précédente.
Ajoutez maintenant un formulaire d’authentification (formulaire de type Login) et appelez le « LoginForm.vb » et adaptez la structure de son code comme suit :
Imports System.Web.ClientServices.ProvidersPublic Class Authentification Implements IClientFormsAuthenticationCredentialsProvider Private Sub OK_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles OK.Click Me.DialogResult = Windows.Forms.DialogResult.OK End Sub Private Sub Cancel_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Cancel.Click Me.DialogResult = Windows.Forms.DialogResult.Cancel End Sub Public Function GetCredentials() As System.Web. _ ClientServices.Providers.ClientFormsAuthenticationCredentials _ Implements System.Web.ClientServices.Providers. _ IClientFormsAuthenticationCredentialsProvider.GetCredentials If Me.ShowDialog = Windows.Forms.DialogResult.OK Then Return New ClientFormsAuthenticationCredentials( _ UsernameTextBox.Text, _ PasswordTextBox.Text, False) Else Me.DialogResult = Windows.Forms.DialogResult.Retry End If End FunctionEnd Class
Appelez enfin le fichier « ApplicationEvents.vb » (accessible depuis MyProject/Application/View Application Events) de votre projet winform afin de lui ajouter l’import des System.Web.Security et System.Web ainsi que ce code :
Partial Friend Class MyApplication Private Sub MyApplication_Startup(ByVal sender As Object, _ ByVal e As Microsoft.VisualBasic. _ ApplicationServices.StartupEventArgs) Handles Me.Startup If System.Web.Security.Membership.ValidateUser("", "") Then MsgBox("Bienvenue") Else MsgBox("Vous n'avez pas les autorisations requises !") End If End SubEnd Class
Créez maintenant à partir du Web Site Administration Tools deux utilisateurs dont un auquel vous attribuerez le rôle de « Manager ». Compilez, authentifiez-vous et constatez le résultat !
Haut de page
Exploitez la gestion des rôleshérités d’une application Web dans une application Winform |
Terminons enfin cet exemple de développement d’application dans le cadre de la découverte de Trucs et Astuces en ajoutant l’exploitation de la gestion des rôles hérités du projet WCF.
Pour ce faire, allons modifier la propriété Salaire reprise dans notre classe Employe. Notre objectif étant de n’afficher les salaires qu’aux utilisateurs ayant le statut de manager. La propriété Salaire doit ainsi être modifiée comme suit :
Public Property Salaire() As Decimal Get If My.User.IsInRole("Manager") Then Return _Salaire Else Return 0 End If End Get Set(ByVal value As Decimal) _Salaire = value End SetEnd Property
Cette adaptation de code, spécifique à VB de part l’exploitation du My, permet de gérer cette fonctionnalité et de la répercuter dans l’interface utilisateur sans pour autant modifier le contenu du projet WCF voir Winform.
Une rapide compilation permettra de constater le résultat suivant dans le cadre d’une authentification en dehors du rôle de manager :
Nous voici donc au terme du développement de cette application qui nous a permis de découvrir de nombreux trucs et astuces de développement dans la plateforme .NET/Visual Studio.
Vous imaginez bien que les trucs et astuces d’un développeur peuvent être bien plus nombreux que ceci et parfois très subtils. Je vous suggère d’explorer les couples IDE/Langage de la gamme de produits développeurs de Microsoft, vous serez parfois surpris du temps que vous pourrez gagner en passant parfois une heure à lire un article ou à tenter de pousser un peu plus loin l’outil avec lequel vous travaillez au quotidien de manière peut-être un peu trop superficielle. Combien d’entre vous ne se sont pas surpris à tenter de réinventer ce qui existait déjà dans au sein des couples Visual Studio / Langages associés ?
Haut de page
Quelques derniers trucs-astuces |
Ouvrez vos répertoires depuis Visual Studio
Une des astuces bien sympathique est entre autre la possibilité d’ouvrir directement depuis Visual Studio 2008 vos répertoires dans Windows Explorer. Observez la capture suivante démontrant l’astuce.
Organisez aisément vos Usings
Une autre astuce rapide est l’enrichissement du menu contextuel de votre code C# avec le menu Organisez vos Usings. Vous pourrez ainsi épurer et/ou trier ceux-ci.
Parcourez vos objets en exploitant le CTRL+TAB
Vous remarquerez au travers de la capture suivante une nette amélioration du parcours des éléments de votre projet en exploitant le raccourcis clavier : CTRL+TAB. Effectivement, au-delà d’une retouche graphique, celui-ci vous proposera un aperçu sous forme de miniature de votre fichier ouvert.
Haut de page
Grégory Renard
CTO - R&I Manager Wygwam Microsoft Regional Director - Microsoft MVP (Most Valuable Professionnal) Wygwam France - 1 rue de la Performance - F-59650 Villeneuve d'Ascq - Tél : +33 (0)3 20 82 38 77
|
http://www.wygwam.com/ - http://blogs.developpeur.org/redo/ - WygwamTV
Cet article a d'abord été publié dans le Hors Série .Net de Programmez de juin - juillet - août 2008 avant d'être adapté pour MSDN.
Haut de page