Procédure : Héberger un objet distant dans un service Windows
Sur cette page
Objectifs
S'applique à
Résumé
Points à connaître
Créer la classe d'objet distant
Créer une application d'hébergement de service Windows
Créer un compte Windows pour exécuter le service
Installer le service Windows
Créer une application cliente de test
Ressources supplémentaires
Objectifs
Ce module vous permet d'effectuer les opérations suivantes :
-
héberger un objet distant dans un service Windows ;
-
accéder à un objet distant à partir d'une application cliente à l'aide d'un canal TCP.
S'applique à
Ce module s'applique aux produits et technologies suivants :
-
Microsoft Windows XP ou Windows 2000 Server (avec le Service Pack 3) et systèmes d'exploitation ultérieurs
-
Microsoft .NET Framework version 1.0 (avec le Service Pack 2) et versions ultérieures
-
Microsoft Visual Studio® 1.0 .NET et versions ultérieures
-
Microsoft Visual C#® .NET
Résumé
Les objets distants générés à l'aide de la fonctionnalité .NET Remoting de l'environnement Microsoft® .NET Framework doivent être hébergés dans les services Microsoft Windows®, dans les exécutables personnalisés ou dans ASP.NET afin de les rendre accessibles aux applications clientes. Ce module explique comment héberger un objet distant dans un service Windows et comment l'appeler à partir d'une application cliente.
Points à connaître
Avant d'utiliser ce module, vous devez tenir compte des points suivants :
-
Les objets distants (les objets .NET accessibles à distance à l'aide de la technologie .NET Remoting) peuvent être hébergés dans des services Windows, des programmes exécutables personnalisés ou ASP.NET.
-
Les clients communiquent avec des objets distants hébergés dans des programmes exécutables personnalisés ou des services Windows au moyen d'un canal TCP.
-
Les clients communiquent avec des objets distants hébergés dans ASP.NET en utilisant le canal HTTP.
-
Si la sécurité constitue votre priorité, hébergez les objets dans ASP.NET et utilisez le canal HTTP. Vous bénéficiez ainsi des fonctions de sécurité sous-jacentes de ASP.NET et de IIS.
Pour plus d'informations sur l'hébergement d'un objet distant dans ASP.NET (avec IIS), consultez l'article 312107 de la Base de connaissances Microsoft, « HOW TO: Host a Remote Object in Microsoft Internet Information Services » (en anglais), à l'adresse :
http://support.microsoft.com/default.aspx?scid=312107. -
Si vous privilégiez les performances, hébergez les objets dans un service Windows et utilisez le canal TCP. Cette option ne fournit aucune sécurité intégrée.
Créer la classe d'objet distant
Cette procédure permet de créer une classe d'objet distant simple. Elle fournit une méthode nommée Add qui ajoutera deux chiffres associés et renverra le résultat.
-
Pour créer la classe d'objet distant
-
Démarrez Visual Studio .NET et créez un projet de bibliothèque de classes Visual C# nommé RemoteObject.
-
Utilisez l'Explorateur de solutions pour renommer class1.cs en Calculator.cs.
-
Dans le fichier Calculator.cs, renommez Class1 en Calculator et renommez le constructeur par défaut de manière appropriée.
-
Extrayez la classe Calculator de MarshalByRefObject afin de rendre la classe distante.
public class Calculator : MarshalByRefObject
-
Ajoutez la méthode publique suivante à la classe Calculator.
public int Add( int operand1, int operand2 ) { return operand1 + operand2; } -
Dans le menu Générer, choisissez Générer la solution.
-
Créer une application d'hébergement de service Windows
Cette procédure permet de créer une application de service Windows utilisée pour héberger l'objet distant. Une fois le service démarré, il configure le canal distant TCP pour écouter les demandes du client.
Remarque : cette procédure fait appel à une classe Installer et exécute l'utilitaire de ligne de commande Installutil.exe pour installer le service Windows. Pour désinstaller le service, exécutez Installutil.exe avec le commutateur /u. Vous pouvez également utiliser un projet de configuration ou de déploiement qui vous aide à installer et à désinstaller le service Windows.
-
Pour créer une application hôte de service Windows
-
Ajoutez un nouveau projet de service Windows Visual C# nommé RemotingHost à la solution actuelle.
-
Utilisez l'Explorateur de solutions pour renommer Service1.cs en RemotingHost.cs.
-
Dans le fichier RemotingHost.cs, renommez la classe Service1 en HostService et renommez le constructeur par défaut de manière appropriée.
-
Ajoutez l'instruction using suivante en haut du fichier, sous les instructions using existantes.
using System.Runtime.Remoting;
-
Recherchez la méthode Main et remplacez la ligne de code existante qui initialise la variable ServicesToRun comme suit.
ServicesToRun = new System.ServiceProcess.ServiceBase[] { new HostService() }; -
Recherchez la méthode InitializeComponent et attribuez la valeur RemotingHost à la propriété ServiceName.
this.ServiceName = "RemotingHost";
-
Recherchez la méthode OnStart et ajoutez la ligne de code suivante pour la configuration à distance. Le chemin complet du fichier de configuration sera transmis en tant que paramètre de démarrage au service.
RemotingConfiguration.Configure(args[0]);
-
Ajoutez un nouveau fichier de classe C# au projet et nommez-le HostServiceInstaller.
-
Ajoutez une référence d'assembly à l'assembly System.Configuration.Install.dll.
-
Ajoutez les instructions using suivantes en haut du fichier HostServiceInstaller , sous l'instruction using existante.
using System.ComponentModel; using System.ServiceProcess; using System.Configuration.Install;
-
Extrayez la classe HostServiceInstaller à partir de la classe Installer.
public class HostServiceInstaller : Installer
-
Ajoutez l'attribut RunInstaller au niveau de la classe comme suit.
[RunInstaller(true)] public class HostServiceInstaller : Installer
-
Ajoutez les deux variables de membre privé suivantes à la classe HostServiceInstaller. Ces objets seront utilisés lors de l'installation du service.
private ServiceInstaller HostInstaller; private ServiceProcessInstaller HostProcessInstaller;
-
Ajoutez le code suivant au constructeur de la classe HostServiceInstaller.
HostInstaller = new ServiceInstaller(); HostInstaller.StartType = System.ServiceProcess.ServiceStartMode.Manual; HostInstaller.ServiceName = "RemotingHost"; HostInstaller.DisplayName = "Service hôte de calcul"; Installers.Add (HostInstaller); HostProcessInstaller = new ServiceProcessInstaller(); HostProcessInstaller.Account = ServiceAccount.User; Installers.Add (HostProcessInstaller);
-
Dans l'Explorateur de solutions, cliquez avec le bouton droit sur RemotingHost, pointez sur Ajouter et cliquez sur Ajouter un nouvel élément.
-
Dans la liste Modèles, cliquez sur Fichier texte et nommez le fichier app.config.
Les fichiers de configuration possédant le nom app.config sont automatiquement copiés par Visual Studio .NET lors du processus de génération dans le dossier de sortie (par exemple, < répprojet>\bin\debug) puis renommés sous la forme< nomapplication>.config. -
Cliquez sur OK pour ajouter le nouveau fichier de configuration.
-
Ajoutez les éléments de configuration suivants au nouveau fichier de configuration.
<configuration> <system.runtime.remoting> <application name="RemoteHostService"> <service> <wellknown type="RemoteObject.Calculator, RemoteObject" objectUri="RemoteObject.Calculator" mode="Singleton" /> </service> <channels> <channel ref="tcp" port="8085"> <serverProviders> <formatter ref="binary" /> </serverProviders> </channel> </channels> </application> </system.runtime.remoting> </configuration> -
Dans le menu Générer, choisissez Générer la solution.
-
Créer un compte Windows pour exécuter le service
Cette procédure permet de créer un compte Windows qui sert à exécuter le service Windows.
-
Pour créer un compte Windows destiné à exécuter le service
-
Créez un compte d'utilisateur local nommé RemotingAccount. Entrez un mot de passe et activez la case à cocher Le mot de passe n'expire jamais.
-
Dans le groupe de programmes Outils d'administration, cliquez sur Stratégie de sécurité locale.
-
Utilisez l'outil Stratégie de sécurité locale pour accorder le privilège Ouvrir une session en tant que service au nouveau compte.
-
Installer le service Windows
Cette procédure installe le service Windows à l'aide de l'utilitaire installutil.exe, puis démarre le service.
-
Pour installer le service Windows
-
Ouvrez une fenêtre de commande et remplacez le répertoire par le répertoire Bin\Debug sous le dossier de projet RemotingHost.
-
Exécutez l'utilitaire installutil.exe pour installer le service.
installutil.exe remotinghost.exe
-
Dans la boîte de dialogue Définir l'ouverture de session du service, entrez le nom d'utilisateur et le mot de passe du compte créé lors de la procédure précédente et cliquez sur OK.
Affichez les résultats à l'aide de l'utilitaire installutil.exe et vérifiez que le service a été correctement installé. -
Copiez l'assembly RemoteObject.dll dans le répertoire de sortie du projet RemotingHost (RemotingHost\Bin\Debug).
-
À partir du groupe de programmes Outils d'administration, démarrez le composant logiciel enfichable MMC Services.
-
Dans la liste Services, cliquez avec le bouton droit sur Service hôte Calculator et cliquez sur Propriétés.
-
Entrez le chemin complet du fichier de configuration du service (remotinghost.exe.config) dans le champ Paramètres de démarrage.
Remarque : pour accélérer le processus, sélectionnez et copiez le champ Chemin d'accès au fichier exécutable, puis collez-le dans le champ Paramètres de démarrage. Ajoutez ensuite la chaîne « .config ».
-
Cliquez sur Démarrer pour lancer le service.
-
Vérifiez que l'état du service est désormais Démarré.
-
Cliquez sur OK pour fermer la boîte de dialogue Propriétés.
-
Créer une application cliente de test
Lors de cette procédure, vous allez créer une application console de test qui est utilisée pour appeler l'objet distant dans le service Windows.
-
Pour créer une application cliente de test
-
Ajoutez une nouvelle application console Visual C# Visual nommée RemotingClient à la solution actuelle.
-
Dans l'Explorateur de solutions, cliquez avec le bouton droit sur RemotingClient, puis sur Définir comme projet de démarrage.
-
Ajoutez une référence d'assembly à l'assembly System.Runtime..NET Remoting.dll.
-
Ajoutez une référence de projet au projet RemoteObject.
-
Ajoutez les instructions using suivantes en haut du fichier class1.cs, sous les instructions using existantes.
using System.Runtime.Remoting.Channels; using System.Runtime.Remoting.Channels.Tcp; using RemoteObject;
-
Ajoutez le code de test suivant à la méthode Main pour appeler et invoquer l'objet Calculator hébergé par le service Windows.
TcpChannel chan = new TcpChannel(); ChannelServices.RegisterChannel(chan); Calculator calc = (Calculator)Activator.GetObject( typeof(RemoteObject.Calculator), "tcp://localhost:8085/RemoteObject.Calculator"); if (calc == null) System.Console.WriteLine("Impossible de localiser le serveur."); else Console.WriteLine("21 + 21 is : " + calc.Add(21,21) ); -
Dans le menu Générer, choisissez Générer la solution.
-
Exécutez l'application cliente et vérifiez que le résultat affiché dans la fenêtre de sortie de la console est correct.
-
Ressources supplémentaires
Pour plus d'informations sur l'hébergement d'un objet distant dans ASP.NET (avec IIS), consultez l'article 312107 de la Base de connaissances Microsoft, « HOW TO: Host a Remote Object in Microsoft Internet Information Services » (en anglais), à l'adresse : http://support.microsoft.com/default.aspx?scid=312107.