COM+ Integration : COM+ Hosted
Cet exemple montre comment exposer une interface depuis une application COM+ en tant que service Windows Communication Foundation (WCF) et comment l'appeler à partir d'un client WCF. Cet exemple se compose d'un programme de console client (.exe) et d'une application bibliothèque Enterprise Services (.dll) enregistrée dans COM+. Il est basé sur l'exemple Getting Started, exemple qui implémente un service de calculatrice. Il ressemble, en outre, à l'exemple COM+ Integration: Web-Hosted. En utilisant l'hébergement COM+ et le transport TCP, l'approche adoptée dans cet exemple se révèle plus performante que celle adoptée par l'exemple COM+ Integration: Web-Hosted. Elle nécessite cependant l'activation explicite préalable de l'application COM+ pour permettre le traitement des demandes.
Remarque : |
---|
La procédure d'installation ainsi que les instructions de génération relatives à cet exemple figurent en fin de rubrique. |
L'application Enterprise Services contient un composant unique qui implémente une interface ICalculator
unique, laquelle expose les opérations mathématiques suivantes : addition, soustraction, multiplication et division.
// Define the component's interface.
public interface ICalculator
{
double Add(double n1, double n2);
double Subtract(double n1, double n2);
double Multiply(double n1, double n2);
double Divide(double n1, double n2);
}
Cette interface est exposée en tant que contrat de service, lequel définit un modèle de communication demande-réponse. Le client adresse des demandes synchrones à une opération mathématique, puis le service et le composant sous-jacent répondent à cette demande en transmettant le résultat. L'activité du client est affichée dans la fenêtre de console.
Le service est hébergé en cours de processus à l'aide de COM+. L'application ServiceModelHostedSample
doit être démarrée manuellement pour permettre l'activation des points de terminaison du service. L'implémentation de la classe ESCalculatorService
calcule, puis retourne le résultat approprié.
// Supporting implementation for the ICalculator interface.
public class ESCalculatorService : ServicedComponent, ICalculator
{
public double Add(double n1, double n2)
{
return n1 + n2;
}
public double Subtract(double n1, double n2)
{
return n1 - n2;
}
public double Multiply(double n1, double n2)
{
return n1 * n2;
}
public double Divide(double n1, double n2)
{
return n1 / n2;
}
}
Remarque : |
---|
Cette classe ne comporte aucun code ServiceModel spécifique. Elle correspond, en outre, à un assembly Enterprise Services standard défini avec les attributs Enterprise Services, puis signé et ajouté au GAC (Global Assembly Cache). |
COM+ Service Model Configuration Tool (ComSvcConfig.exe) permet d'ajouter un service de prise en charge pour l'interface sélectionnée. Le code suivant est utilisé à cette fin :
ComSvcConfig.exe /install /application:ServiceModelHostedSample /contract:"ServiceModelHostedSample.ESCalculator,ICalculator" /hosting:complus /mex /verbose
Dans ce cas de figure, l'outil ajoute un service à l'interface ICalculator
du composant ServiceModelHostedSample.ESCalculator
, lequel figure dans l'application ServiceModelHostedSample
. Le service est hébergé dans COM+ à l'aide du point de terminaison MEX. Un composant ServiceModelInitializer
est ajouté à l'application pour faciliter l'intégration et un fichier de configuration d'application est généré dans le répertoire racine de l'application COM+, à savoir dans %PROGRAMFILES%\ComPlus Applications\{4cdcdb2c-0b19-4534-95cd-fbbff4d67dd9}\. Au démarrage de l'application, le composant ServiceModelInitializer
vérifie le fichier de configuration d'application, puis démarre les points de terminaison de service configurés de manière adéquate.
Pour les services hébergés par COM+, l'outil COM+ Service Model Configuration Tool (ComSvcConfig.exe) crée des points de terminaison de service à l'aide de la liaison netNamedPipeBinding, ce qui permet uniquement d'accéder au même ordinateur. Le fichier de configuration doit être à nouveau modifié pour permettre la création de points de terminaison sur d'autres transports. Cet exemple utilise un fichier de configuration personnalisé qui expose l'application sur les transports TCP et HTTP en utilisant les liaisons netTcpBinding et wsHttpBinding :
<!-- Specify the service (application and component GUIDs) and service and MEX endpoints -->
<services>
<service behaviorConfiguration="ComServiceMexBehavior"
name="{4CDCDB2C-0B19-4534-95CD-FBBFF4D67DD9},{C2B84940-AD54-4A44-B5F7-928130980AB9}">
<endpoint
address="ICalculator"
binding="netTcpBinding"
bindingConfiguration="comNonTransactionalBinding"
contract="{8803CCEC-4DFB-49a7-925B-60025C32E5CD}" />
<endpoint
address="ICalculator"
binding="wsHttpBinding"
bindingConfiguration="comNonTransactionalBinding"
contract="{8803CCEC-4DFB-49a7-925B-60025C32E5CD}" />
<endpoint
address="mex"
binding="mexHttpBinding"
contract="IMetadataExchange" />
<host>
<!-- Specify base addresses for both transports -->
<baseAddresses>
<add baseAddress="net.tcp://localhost:8081/ServiceModelHostedSample" />
<add baseAddress="https://localhost:8082/ServiceModelHostedSample" />
</baseAddresses>
</host>
</service>
</services>
Dans cet exemple, le fichier de configuration personnalise également le nom et l'espace de noms du service et peut être utilisé pour exposer uniquement un sous-ensemble des opérations proposées par le composant. Dans ce cas, la méthode Divide fait l'objet d'un commentaire et ne figure pas dans le contrat de service exposé :
<!-- comContract specifying the name, namespace and methods for the service -->
<comContracts>
<comContract
contract="{8803CCEC-4DFB-49a7-925B-60025C32E5CD}"
name="ICalculator"
namespace="https://microsoft.com/Microsoft.ServiceModel.Samples/EnterpriseServicesHosted"
requiresSession="true">
<exposedMethods>
<add exposedMethod="Add" />
<add exposedMethod="Subtract" />
<add exposedMethod="Multiply" />
<!-- <add exposedMethod="Divide" /> -->
</exposedMethods>
</comContract>
</comContracts>
Le client communique sur un contrat à l'aide d'un client généré par Service Metadata Utility Tool (Svcutil.exe). Le client est contenu dans le fichier generatedClient.cs et bénéficie d'une configuration compatible dans App.config. Cet utilitaire récupère les métadonnées d'un service et génère un client permettant de communiquer sur un type de contrat. Le service hébergé doit être disponible pour permettre la génération du code du client, ce service étant utilisé pour récupérer les métadonnées de service. Exécutez la commande suivante à partir d'une invite de commandes dans le répertoire client pour générer le proxy typé :
svcutil.exe /n:http://Microsoft.ServiceModel.Samples,Microsoft.ServiceModel.Samples https://localhost:8082/ServiceModelHostedSample/mex /out:generatedClient.cs /config:App.config
L'implémentation de client construit une instance du client généré à l'aide de la configuration de la liaison TCP. Cette implémentation permet ensuite de débuter la communication avec le service.
// Create a client.
CalculatorClient client = new CalculatorClient("NetTcpBinding_ICalculator ");
WSHttpBinding_ICalculator
// Call the Add service operation.
double value1 = 100.00D;
double value2 = 15.99D;
double result = client.Add(value1, value2);
Console.WriteLine("Add({0},{1}) = {2}", value1, value2, result);
// Call the Subtract service operation.
value1 = 145.00D;
value2 = 76.54D;
result = client.Subtract(value1, value2);
Console.WriteLine("Subtract({0},{1}) = {2}", value1, value2, result);
// Call the Multiply service operation.
value1 = 9.00D;
value2 = 81.25D;
result = client.Multiply(value1, value2);
Console.WriteLine("Multiply({0},{1}) = {2}", value1, value2, result);
//Closing the client gracefully closes the connection and cleans up resources.
client.Close();
Lorsque vous exécutez l'exemple, les demandes et réponses d'opération s'affichent dans la fenêtre de console cliente. Cet exemple illustre la manière dont le service WCF généré à partir d'un client WCF est utilisé. Appuyez sur ENTER dans la fenêtre du client pour l'arrêter.
Add(100,15.99) = 115.99
Subtract(145,76.54) = 68.46
Multiply(9,81.25) = 731.25
Press <ENTER> to terminate client.
Pour configurer et générer l'exemple
Assurez-vous d'avoir effectué la procédure figurant à la section Procédure d'installation unique pour les exemples Windows Communication Foundation.
Pour générer l'édition C# ou Visual Basic .NET de la solution, conformez-vous aux instructions figurant dans la rubrique Génération des exemples Windows Communication Foundation. Lors de la génération, un script est exécuté permettant la création d'une application COM+ pour laquelle il est spécifié qu'elle doit continuer à s'exécuter en cas d'inactivité, empêchant ainsi l'arrêt du point de terminaison de service dans un tel cas.
À partir d'une invite de commandes, naviguez jusqu'au dossier service\bin de l'exemple. Si vous utilisez Windows Vista ou Windows Server 2008, exécutez l'invite de commandes en tant qu'administrateur.
Entrez gacutil.exe /i ESCalculatorHosted.dll pour ajouter l'assembly au GAC (Global Assembly Cache). Vérifiez que Gacutil.exe figure dans votre chemin d'accès.
Entrez regsvcs.exe ESCalculatorHosted.dll pour enregistrer le composant de l'assembly et l'application ServiceModelSample avec COM+. Vérifiez que Regsvcs.exe figure dans votre chemin d'accès.
Entrez ComSvcConfig.exe /install /application:ServiceModelHostedSample /contract:"ServiceModelHostedSample.ESCalculator,ICalculator" /hosting:complus /mex /verbose pour exposer l'interface comme service hébergé IIS. Vérifiez que ComSvcConfig.exe figure dans votre chemin d'accès.
Pour remplacer la configuration par défaut par la configuration personnalisée de cet exemple, copiez le fichier Service/application.config dans le répertoire %ProgramFiles%\ComPlus Applications\{4cdcdb2c-0b19-4534-95cd-fbbff4d67dd9}\.
Pour exécuter l'exemple sur le même ordinateur
Pour démarrer l'application et les points de terminaison, à l'aide de la console de gestion Services de composant cliquez avec le bouton droit de la souris sur ServiceModelHostedSample, puis sélectionnez Démarrer.
Assurez-vous que les services sont accessibles en tapant l'adresse suivante https://localhost:8082/ServiceModelHostedSample. Une page de confirmation doit s'afficher en réponse.
Exécutez Client.exe à partir du dossier \client\bin\ figurant dans le dossier correspondant à votre langue. L'activité du client s'affiche dans sa fenêtre de console.
Si le client et le service ne parviennent pas à communiquer, consultez Conseils de dépannage.
Remarque : L'exemple construit un programme client d'application console. Vous devez le lancer à l'aide d'une invite de commandes pour afficher son résultat.
Pour exécuter l'exemple sur plusieurs ordinateurs
Copiez les fichiers ESCalculatorHosted.dll et CreateAppLeaveRunning.vb depuis le répertoire service\bin et le répertoire de service respectivement dans un répertoire de l'ordinateur de service.
À partir d'une invite de commandes, naviguez jusqu'à ce répertoire de destination. Si vous utilisez Windows Vista ou Windows Server 2008, exécutez l'invite de commandes en tant qu'administrateur.
Exécutez le script CreateAppLeaveRunning.vbs pour créer l'application COM+ avec le paramètre spécifiant qu'elle doit continuer à s'exécuter en cas d'inactivité.
Entrez gacutil.exe /i ESCalculatorHosted.dll pour ajouter l'assembly au GAC (Global Assembly Cache). Vérifiez que Gacutil.exe figure dans votre chemin d'accès.
Entrez regsvcs.exe ESCalculatorHosted.dll pour enregistrer le composant de l'assembly et l'application ServiceModelSample avec COM+. Vérifiez que Regsvcs.exe figure dans votre chemin d'accès.
Entrez ComSvcConfig.exe /install /application:ServiceModelHostedSample /contract:"ServiceModelHostedSample.ESCalculator,ICalculator" /hosting:complus /mex /verbose pour exposer l'interface comme service hébergé par IIS. Vérifiez que ComSvcConfig.exe figure dans votre chemin d'accès.
Pour remplacer la configuration par défaut par la configuration personnalisée de cet exemple, copiez le fichier Service/application.config dans le répertoire %ProgramFiles%\ComPlus Applications\{4cdcdb2c-0b19-4534-95cd-fbbff4d67dd9}\.
Dans le fichier de configuration d'application du service, modifiez l'adresse du point de terminaison afin qu'elle corresponde à la nouvelle adresse de votre service. Remplacez toutes les occurrences de « localhost » de l'adresse par un nom de domaine complet.
Pour démarrer l'application et les points de terminaison, à l'aide de la console de gestion Services de composant cliquez avec le bouton droit de la souris sur ServiceModelHostedSample, puis sélectionnez Démarrer.
Copiez les fichiers programme du client du dossier \client\bin\ (situé dans le dossier correspondant à votre langue) sur l'ordinateur client.
Si le service ne s'exécute pas sous un compte de domaine, ouvrez le fichier de configuration du client, puis modifiez l'adresse du point de terminaison en fonction de la nouvelle adresse de votre service. Remplacez toutes les occurrences de « localhost » de l'adresse par un nom de domaine complet. Si le service s'exécute sous un compte de domaine, régénérez la configuration du client en exécutant Svcutil.exe par rapport au service. Utilisez le fichier généré au lieu du fichier de configuration utilisé dans l'exemple. Le fichier de configuration généré contient des informations d'identité supplémentaires et contient tous les paramètres nécessaires à la connexion au point de terminaison du service bien qu'il s'agisse de paramètres par défaut.
Assurez-vous que le service est accessible depuis l'ordinateur du client en utilisant un navigateur.
Sur l'ordinateur client, lancez Client.exe à partir d'une invite de commandes.
Pour procéder au nettoyage après exécution de l'exemple
- Pour des raisons de sécurité, supprimez le composant ESCalculatorHosted du Global Assembly Cache, l'application COM+ ServiceModelHostedSample ainsi que le répertoire racine d'application %PROGRAMFILES%\ComPlus Applications\{4cdcdb2c-0b19-4534-95cd-fbbff4d67dd9}\ une fois l'exécution de l'exemple terminée.
Send comments about this topic to Microsoft.
© 2007 Microsoft Corporation. All rights reserved.