Fichiers de configuration.net Remoting
2 Fichiers de configuration.net Remoting 29/07/09 Sommaire 1 Introduction... 3 2 Qu es ce qu un fichier de configuration?... 4 3 L intérieur du fichier... 5 3.1 Pour un modèle CAO... 5 3.2 Pour un modèle WKO... 7 4 Implémentation dans le code... 9 4.1 Dans le code serveur... 9 4.2 Dans le code client... 9 4.2.1 Code client CAO... 9 4.2.2 Code client WKO... 9 5 Durée de vie... 11 6 Exemple... 12 7 Conclusion... 16
3 Fichiers de configuration.net Remoting 29/07/09 1 Introduction Dans ce chapitre, nous allons nous pencher sur les fichiers de configuration. En effet dans la plupart de nos programmes, l adresse de nos serveurs, les protocoles des canaux ou le numéro du port sont définis à l intérieur du code. Ici nous allons voir une nouvelle méthode utilisant des fichiers de configuration.
4 Fichiers de configuration.net Remoting 29/07/09 2 Qu est ce qu un fichier de configuration? Le fichier de configuration du.net remoting se présente avec l extension.config. Souvent nommé App.config (par défaut), il s agit d un fichier contenant une architecture de balise précise permettant à notre programme de récupérer les informations. Le fichier de configuration contient : Des informations sur l application hôte. Le nom des objets. L URI des objets. Les canaux enregistrés. Des informations sur la durée de bail.
5 Fichiers de configuration.net Remoting 29/07/09 3 L intérieur du fichier L intérieur du fichier de configuration contient différentes balises : La balise d entête suivante : Cet entête est par défaut créée lors de la création d un fichier par Visual Studio 2008. Elle renseigne la version et l encodage effectués sur le fichier. La balise configuration est la racine du document ; ici le fait que la balise soit «configuration» montre qu elle servira à paramétrer certaines fonctions du.net Remoting. La balise system.runtime.remoting contient les paramètres qui seront pris en charge par la structure.net Remoting. On peut y retrouver entre autres, les canaux, le protocole 3.1 Pour un modèle CAO A chaque modèle d activation correspond une mise en forme du fichier de configuration. Pour le serveur lors d une activation côté client, on réalise un fichier le plus souvent similaire à celui-ci : <application name="operation"> Ce code peut remplacer celui-ci : RemotingConfiguration.ApplicationName = "Operation"; Ensuite on peut définir les paramètres tels que : Activation avec un code similaire à celui-ci :
6 Fichiers de configuration.net Remoting 29/07/09 <application name="operation"> <service> <activated type="serveur.serveuroperation, Serveur"/> </service> Remplaçant le code suivant : RemotingConfiguration.RegisterActivatedServiceType(typeof(ServeurOperatio n)); En effet les balises <service> référence tous les types de service tels que l activation. Le canal de transport : pour le configurer dans notre fichier il convient de saisir les lignes suivantes <channels> <channel ref="tcp" port="8000" /> </channels> Ici notre canal utilise le protocole TCP et le port 8085. Nous allons maintenant nous pencher sur le fichier de configuration client. Celui-ci est assez similaire. <client url="tcp://localhost:8000/operation"> <activated type=" ServeurInterface.IServeurOperation, ServeurInterface "/> </client> <channels> <channel ref="tcp" /> </channels> On note toutefois des différences notables : Le paramètre name n existe plus dans la balise application
7 Fichiers de configuration.net Remoting 29/07/09 Les balises service sont remplacées par les balises client, car ici on fait appel à un service. <client url="tcp://localhost:8000/operation"> <activated type=" ServeurInterface.Operation, ServeurOperation "/> </client> On note l apparition de l url qui correspond à l adresse réseau de l objet Dans le code client on ne spécifie le canal que par le protocole sur le client (le port étant contenu dans l url) <client url="tcp://localhost:8000/operation"> <activated type=" ServeurInterface.Operation, ServeurOperation "/> </client> <channels> <channel ref="tcp" /> </channels> 3.2 Pour un modèle WKO Les fichiers de configuration pour le mode d activation serveur sont légèrement différents du mode CAO. Par exemple le nom du service ne se trouve plus dans la balise application mais c est le service qui le contient. On voit apparaitre une balise <WellKnow> qui prend plusieurs paramètres dont le mode d activation SingleCall ou Singleton. objecturi contient le nom du service. Enfin les balises pour la programmation du canal restent inchangées.
8 Fichiers de configuration.net Remoting 29/07/09 <service> <wellknown type=" ServeurInterface.Operation, ServeurOperation " mode="singlecall" objecturi="operation" /> </service> <channels> <channel ref="tcp" port="8000" /> </channels> Dans le code client on retrouve là encore les balises <client> qui regroupent les services, dont le WKO représenté par la balise <wellknow>. Le reste du code est similaire à celui du CAO. <client> <wellknown type=" ServeurInterface.Operation, ServeurOperation " url="tcp://localhost:8000/operation" /> </client> <channels> <channel ref="tcp" /> </channels>
9 Fichiers de configuration.net Remoting 29/07/09 4 Implémentation dans le code 4.1 Dans le code serveur Pour utiliser le fichier de configuration dans notre code serveur et ainsi réduire celui-ci à un simple appel de fichier, on utilise la méthode suivante : RemotingConfiguration.Configure(string filename,bool ensuresecurity); VB.NET Dim filename As String Dim ensuresecurity As Boolean RemotingConfiguration.Configure(filename, ensuresecurity) Ainsi on intègre tous les paramètres de configuration contenus dans le fichier. Le string correspond au nom du fichier (et extension) et le booléen permet de définir si la sécurité est requise ou non. RemotingConfiguration.Configure("app.config",false); VB.NET RemotingConfiguration.Configure("app.config", False) Cette ligne remplace toute les lignes de création de canal et d activation que ce soit en CAO ou WKO. Seul le fichier de configuration sera différent comme vu précédemment. 4.2 Dans le code client Le code client quant à lui est différent entre les deux modes d activation. 4.2.1 Code client CAO Le code client pour le mode d activation CAO se caractérise par le chargement du fichier et des paramètres qu il contient et d un simple appel de service comme ceci : RemotingConfiguration.Configure("app.config",false); VB.NET RemotingConfiguration.Configure("app.config", False) Il suffit ensuite de faire appel au service comme vu dans le chapitre 2 (déclaration du service et appel de ces méthodes). 4.2.2 Code client WKO Le code client pour le mode d activation WKO est légèrement différent du code sans fichier. En effet dans le chapitre 2 on avait vu que le client WKO utilisait simplement cette ligne pour se connecter au service.
10 Fichiers de configuration.net Remoting 29/07/09 Interface.IServeurOperation Service = (Interface.IServeurOperation)Activator.GetObject( typeof(interface.iserveuroperation), "tcp://localhost:8000/serveuroperation"); VB.NET Dim Service As Interface.IServeurOperation = DirectCast(Activator.GetObject(GetType(Interface.IServeurOperation), "tcp://localhost:8000/serveuroperation"), Interface.IServeurOperation) Cette ligne regroupe en fait une multitude d informations telles que : Le type de l objet distribué L adresse de cet objet Et enfin une demande de connexion à cet objet. Mais avec le fichier de configuration, il est nécessaire de séparer la demande de connexion qui fera partie du code et les paramètres qui feront partie du fichier X ML. Ainsi on commence donc par ajouter le fichier dans notre code avec la ligne suivante : RemotingConfiguration.Configure("app.config",false); VB.NET RemotingConfiguration.Configure("app.config", False) Il faut ensuite récupérer les informations pour la connexion et se connecter grâce aux lignes suivantes : WellKnownClientTypeEntry entry = RemotingConfiguration.GetRegisteredWellKnownClientTypes()[0]; IServeurOperation Service = RemotingServices.Connect(entry.ObjectType, entry.objecturl) as IServeurOperation; VB.NET Dim entry As WellKnownClientTypeEntry = RemotingConfiguration.GetRegisteredWellKnownClientTypes()(0) Dim Service As IServeurOperation = TryCast(RemotingServices.Connect(entry.ObjectType, entry.objecturl), IServeurOperation) Ici entry.objecttype correspond au type défini dans la balise Wellknown et entry.objecturl correspond à l adresse défini dans la même balise.
11 Fichiers de configuration.net Remoting 29/07/09 5 Durée de vie La durée de vie de l objet décrit précédemment peut être aussi paramétrée dans le fichier. En effet dans le fichier de configuration serveur, on peut paramétrer les différentes propriétés, (leasetime, renewoncalltime, ). Pour intégrer la durée de vie dans le fichier.config, il faut intégrer la balise orpheline <lifetime /> à l intérieur des balises. <lifetime leasetime="2s" sponsorshiptimeout="2s" renewoncalltime="2s" />
12 Fichiers de configuration.net Remoting 29/07/09 6 Exemple Ici je vais montrer avec l exemple du chapitre 2 (addition), comment ajouter les fichiers de configuration. La première étape réalisée consiste à créer un fichier «Client.config» dans le dossier Debug dans lequel la solution Client.exe sera générée (C:\User\PFCH5\Visual Studio 2008\Projects\SolutionRemotable\Client\bin\Debug), ainsi qu un fichier «Serveur.config» dans le dossier debug du serveur (C:\User\PFCH5\Visual Studio 2008\Projects\SolutionRemotable\Serveur\bin\Debug). Voici donc le code xml Client.config : <?xml version="1.0" encoding="utf-8"?> <client> <wellknown type="interface.iserveuroperation, Interface" url="tcp://localhost:8000/serveuroperation"/> </client> <channels> <channel ref="tcp" /> </channels> Et celui du serveur Serveur.config : <?xml version="1.0" encoding="utf-8"?> <service> <wellknown type="serveur.serveuroperation, Serveur" mode="singlecall" objecturi="serveuroperation"/> </service> <channels> <channel ref="tcp" port="8000" /> </channels> Ensuite nous ne modifions le code que dans les fichiers : Serveurmain.cs pour qu il prenne en charge le fichier, je rappelle que le mode d activation de ma méthode addition était WKO.
13 Fichiers de configuration.net Remoting 29/07/09 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Runtime.Remoting; using System.Runtime.Remoting.Channels; using System.Runtime.Remoting.Channels.Tcp; namespace Serveur class Serveurmain [STAThread]//ligne à rajouter static void Main(string[] args) RemotingConfiguration.Configure("Serveur.config",false); RemotingConfiguration.RegisterWellKnownServiceType( typeof(serveuroperation), "ServeurOperation", WellKnownObjectMode.SingleCall); Console.ReadLine(); VB.NET Imports System Imports System.Collections.Generic Imports System.Linq Imports System.Text Imports System.Runtime.Remoting Imports System.Runtime.Remoting.Channels Imports System.Runtime.Remoting.Channels.Tcp Namespace Serveur Class Serveurmain 'ligne à rajouter <STAThread()> _ Private Shared Sub Main(ByVal args As String()) RemotingConfiguration.Configure("Serveur.config", False) RemotingConfiguration.RegisterWellKnownServiceType(GetType(ServeurOperati on), "ServeurOperation", WellKnownObjectMode.SingleCall) Console.ReadLine() End Sub End Class End Namespace Program.cs où là aussi on modifie simplement les informations relatives à la connexion comme vu précédemment.
14 Fichiers de configuration.net Remoting 29/07/09 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Runtime.Remoting; using System.Runtime.Remoting.Channels; using System.Runtime.Remoting.Channels.Tcp; using Interface; using Serveur; namespace Client class Program private static IServeurOperation GetService(Type type) foreach (WellKnownClientTypeEntry entry in RemotingConfiguration.GetRegisteredWellKnownClientTypes()) if (entry.objecttype!= null) if (entry.objecturl!= null) return RemotingServices.Connect(entry.ObjectType, entry.objecturl) as IServeurOperation; throw new Exception("erreur"); static void Main(string[] args) int nombre1, nombre2, somme; //configuration du canal TCP RemotingConfiguration.Configure("Client.config",false); WellKnownClientTypeEntry entry = RemotingConfiguration.GetRegisteredWellKnownClientTypes()[0]; IServeurOperation Service = RemotingServices.Connect(entry.ObjectType, entry.objecturl) as IServeurOperation; Console.WriteLine("Entrer le premier nombre:"); nombre1 = Int32.Parse(Console.ReadLine()); Console.WriteLine("Entrer le deuxieme nombre:"); nombre2 = Int32.Parse(Console.ReadLine()); somme = Service.addition(nombre1, nombre2); Console.WriteLine(string.Format("Résultat :0",somme)); Console.ReadLine();
15 Fichiers de configuration.net Remoting 29/07/09 VB.NET Imports System Imports System.Collections.Generic Imports System.Linq Imports System.Text Imports System.Runtime.Remoting Imports System.Runtime.Remoting.Channels Imports System.Runtime.Remoting.Channels.Tcp Imports [Interface] Imports Serveur Namespace Client Class Program Private Shared Function GetService(ByVal type As Type) As IServeurOperation For Each entry As WellKnownClientTypeEntry In RemotingConfiguration.GetRegisteredWellKnownClientTypes() If entry.objecttype IsNot Nothing Then If entry.objecturl IsNot Nothing Then Return TryCast(RemotingServices.Connect(entry.ObjectTyp e, entry.objecturl), IServeurOperation) End If End If Next Throw New Exception("erreur") End Function Private Shared Sub Main(ByVal args As String()) Dim nombre1 As Integer, nombre2 As Integer, somme As Integer 'configuration du canal TCP RemotingConfiguration.Configure("Client.config", False) Dim entry As WellKnownClientTypeEntry = RemotingConfiguration.GetRegisteredWellKnownClientTypes()(0) Dim Service As IServeurOperation = TryCast(RemotingServices.Connect(entry.ObjectType, entry.objecturl), IServeurOperation) Console.WriteLine("Entrer le premier nombre:") nombre1 = Int32.Parse(Console.ReadLine()) Console.WriteLine("Entrer le deuxieme nombre:") nombre2 = Int32.Parse(Console.ReadLine()) somme = Service.addition(nombre1, nombre2) Console.WriteLine(String.Format("Résultat :0", somme)) Console.ReadLine() End Sub End Class End Namespace Le reste de la solution n a pas été modifiée.
16 Fichiers de configuration.net Remoting 29/07/09 7 Conclusion Dans ce chapitre nous avons vu la programmation avancée en Remoting avec l utilisation de fichier pour la configuration. Ces fichiers permettent d indiquer au programme distribué des informations sur les canaux, la durée de vie ou encore le nom de l objet distribué. L avantage démontré dans ce chapitre consiste dans le fait qu un programme utilisant ce fichier n a pas à être recompilé à chaque changement (de port par exemple) ; il suffit juste de changer le.