Création d’un résolveur personnalisé
L’implémentation de l’infrastructure du fournisseur de résolution et d’adaptateur dans Microsoft BizTalk ESB Toolkit utilise un composant de pipeline nommé Dispatcher et des pipelines nommés ItineraryReceive et ItinerarySend.
Le composant de pipeline Dispatcher a quatre propriétés : Validate, Enabled, EndPoint et MapName. La propriété EndPoint peut contenir des chaînes de connexion de programme de résolution avec des valeurs telles que les suivantes, où UDDI :\\ représente le type de résolution à utiliser (moniker racine).
UDDI:\\serverUrl=http://localhost/uddi;serviceName=OrderPurchaseToOrderPost;serviceProvider=Microsoft.Practices.ESB
D’autres monikers pris en charge incluent XPATH :\\, STATIC :\\ et BRE :\\.. Chaque type de moniker utilise une classe spécifique qui implémente l’interface IResolveProvider . Vous pouvez créer vos propres résolveurs personnalisés pour d’autres types de moniker et les inscrire pour les utiliser par le système de résolution dynamique.
Le moniker équivaut à un chaîne de connexion de résolution. Les schémas individuels définissent les paramètres et leur moniker racine. Un programme de résolution prend le programme de résolution chaîne de connexion, le valide et utilise le résultat pour interroger et remplir un objet Dictionary qui peut être utilisé pour le routage, la transformation, la sélection d’itinéraire ou un autre objectif spécifique à votre service.
Configuration du programme de résolution
Vous devez inscrire tous les résolveurs dans le fichier de configuration Esb.config. Le code XML suivant montre un exemple de contenu du fichier de configuration.
<?xml version="1.0" encoding="utf-8"?>
<configuration>
<configSections>
<section name="esb" type="Microsoft.Practices.ESB.Configuration.ESBConfigurationSection, Microsoft.Practices.ESB.Configuration, Version=2.0.0.0, Culture=neutral, PublicKeyToken=c62dd63c784d6e22"/>
<!-- Other Section Definitions Here -->
</configSections>
<esb>
<resolvers cacheManager= "Resolver Providers Cache Manager" absoluteExpiration="3600">
<resolver name="UDDI" type="Microsoft.Practices.ESB.Resolver.UDDI.ResolveProvider, Microsoft.Practices.ESB.Resolver.UDDI, Version=2.0.0.0, Culture=neutral, PublicKeyToken=c62dd63c784d6e22">
<resolverConfig>
<add name="cacheTimeoutValue" value="120" />
<add name="cacheName" value="UDDI Cache Manager" />
</resolverConfig>
</resolver>
<resolver name="XPATH" type="Microsoft.Practices.ESB.Resolver.XPATH.ResolveProvider, Microsoft.Practices.ESB.Resolver.XPATH, Version=2.0.0.0, Culture=neutral, PublicKeyToken=c62dd63c784d6e22"/>
<!-- Other Resolver Definitions Here -->
</resolvers>
<!-- Other ESB Configuration Settings Here -->
</esb>
<!-- Other Configuration Sections Here -->
</configuration>
La section resolverConfig sous chaque nœud de programme de résolution vous permet de configurer des propriétés supplémentaires dont votre programme de résolution peut avoir besoin pour fonctionner dans un environnement spécifique. Pour avoir accès à la configuration, votre programme de résolution doit exposer un constructeur qui accepte un paramètre de type Microsoft.Practices.ESB.Configuration.Resolver. Dans votre implémentation du programme de résolution, les propriétés de configuration sont ensuite accessibles à l’aide de la méthode ReadResolverConfigByKey de la classe ResolverConfigHelper ; Pour ce faire, transmettez le paramètre initialement transmis au constructeur, puis transmettez le nom de la valeur en question. Si aucune paire nom-valeur n’est spécifiée dans le nœud resolverConfig , le constructeur sans paramètre par défaut est utilisé pour instancier votre programme de résolution.
Deux programmes de résolution UDDI (Universal Description, Discovery, and Integration) 3 ont été définis dans la configuration : UDDI 3 et UDDI 3-SOASOFTWARE. Ces deux résolveurs utilisent le même assembly sous-jacent, mais ils fournissent des configurations différentes pour prendre en charge différents registres conformes à UDDI 3.0 avec des formats d’URI (Uniform Resource Identifier) et des exigences de sécurité différents. Si vous devez configurer un moniker supplémentaire pour un registre conforme à UDDI 3.0 en plus de ceux déjà pris en charge, vous pouvez utiliser les propriétés de configuration suivantes :
cacheTimeoutValue
cacheName
publisherKey
useUddiAuth
baseUri
inquireUriSuffix
securityUriSuffix
securityMode. Pour connaître les valeurs valides, consultez l’énumération System.ServiceModel.BasicHttpSecurityMode (https://go.microsoft.com/fwlink/?LinkID=188284& ; clcid=0x409). La valeur par défaut est TransportCredentialOnly.
credentialType. Pour connaître les valeurs valides, consultez l’énumération System.ServiceModel.HttpClientCredentialType (https://go.microsoft.com/fwlink/?LinkId=188285). La valeur par défaut est Windows.
username
mot de passe
Si vous souhaitez créer un programme de résolution qui s’appuie sur les fonctionnalités d’injection de dépendances du bloc d’application Unity, une configuration supplémentaire est nécessaire. Pour plus d’informations, consultez Création d’un programme de résolution personnalisé avec un conteneur Unity.
The IResolveProvider Interface
Tous les résolveurs doivent implémenter l’interface IResolveProvider . L’interface IResolveProvider, située dans le projet Microsoft.Practices.ESB.Resolver, se compose de trois surcharges de la méthode Resolve qui retournent une instance de la classe Dictionary, qui contient les faits de résolution fournis par la instance de la classe de résolveur concret. L’exemple de code suivant montre la signature de ces surcharges de méthode.
// <summary>
// This is the main interface that is called from the
// ResolverMgr class.
// This interface supports being called from a Microsoft BizTalk
// Server pipeline component.
// </summary>
// <param name="config">Configuration string entered into
// pipeline component as argument</param>
// <param name="resolver">Moniker representing the resolver
// to load</param>.
// <param name="message">IBaseMessage passed from pipeline</param>.
// <param name="pipelineContext">IPipelineContext passed from
// pipeline</param>.
// <returns>Dictionary object fully populated</returns>.
Dictionary<string, string> Resolve(string config, string resolver,
IBaseMessage message, IPipelineContext pipelineContext);
// <summary>
// This is the main interface that is called from the ResolverMgr
// class.
// This interface supports being called from a Web service interface.
// </summary>
// <param name="config">Configuration string entered into Web
// service as argument</param>.
// <param name="resolver">Moniker representing the resolver
// to load</param>.
// <param name="message">XML document passed from Web
// service</param>.
// <returns>Dictionary object fully populated</returns>.
Dictionary<string,string> Resolve(string config, string resolver, System.Xml.XmlDocument message);
// <summary>
// This is the main interface that is called from the
// ResolverMgr class.
// This interface supports being called from an orchestration.
// </summary>
// <param name="resolverInfo">Configuration string containing
// configuration and resolver</param>.
// <param name="message">XLANGMessage passed from
// orchestration</param>.
// <returns>Dictionary object fully populated</returns>.
Dictionary<string, string> Resolve(ResolverInfo resolverInfo, XLANGs.BaseTypes.XLANGMessage message);
La structure Résolution, située dans le projet Microsoft.Practices.ESB.Resolver, définit également les paires nom/valeur stockées dans le dictionnaire instance. La structure Resolution expose plusieurs propriétés ; le tableau suivant répertorie les plus pertinents d’entre eux. La méthode CreateResolverDictionary de la classe ResolutionHelper peut être utilisée pour générer un dictionnaire de résolution qui contient les clés les plus utilisées, avec des valeurs de chaîne vides. Le instance Dictionary prend en charge l’ajout de paires nom/valeur du programme de résolution personnalisé via une implémentation concrète de la classe Resolver.
Propriété | Type de données | Type de données | Type de données |
---|---|---|---|
TransformType | String | Champ d’action | String |
Success | Boolean | EpmRRCorrelationTokenField | String |
TransportNamespace | String | InboundTransportLocationField | String |
TransportType | String | InterchangeIDField | String |
TransportLocation | String | ReceiveLocationNameField | String |
Action | String | ReceivePortNameField | String |
MessageExchangePattern | String | InboundTransportTypeField | String |
EndpointConfig | String | IsRequestResponseField | String |
TargetNamespace | String | DocumentSpecStrongNameField | String |
FixJaxRPC | Boolean | DocumentSpecNameField | String |
WindowUserField | String | MessageType | String |
CacheTimeout | String | OutboundTransportCLSID | String |
MethodNameField | String |
Création d’un résolveur personnalisé
Au moment de l’exécution, un pipeline récupère le programme de résolution chaîne de connexion et appelle le gestionnaire de résolution (un instance de la classe ResolverMgr). Le gestionnaire de résolution analyse, remplit et valide le programme de résolution chaîne de connexion. Pour ce faire, il effectue les opérations suivantes :
Il analyse les chaîne de connexion pour déterminer le type de programme de résolution à charger.
Il fait correspondre ce type à un moniker défini dans le fichier de configuration (la clé est le moniker racine, tel que UDDI).
Il lit le nom de l’assembly du programme de résolution pour ce moniker.
Il charge l’assembly spécifié.
Le mécanisme de résolution dynamique met en cache toutes les implémentations chargées de l’interface IResolveProvider pour éviter la lecture répétée des informations de configuration et le chargement des assemblys lorsque plusieurs messages entrants utilisent le même programme de résolution.
Enfin, le gestionnaire de résolution exécute la méthode Resolve de l’implémentation concrète IResolveProvider et retourne le instance Dictionary renseigné.
Pour créer un programme de résolution personnalisé
Créez un assembly avec une classe qui implémente l’interface IResolveProvider et contient une méthode Resolve qui retourne des faits de résolution en tant que instance de la classe Dictionary.
Inscrivez le programme de résolution en l’ajoutant au fichier de configuration Esb.config à l’aide d’un <élément de programme de résolution> qui contient le moniker racine en tant qu’attribut name et le nom d’assembly complet comme attribut de type .
(Facultatif) Créez un schéma qui définit le moniker racine et les paramètres de requête, puis enregistrez-le dans l’ESB. Dossier Schemas.Resolvers. Le nom doit suivre les conventions de nommage ESB existantes ; Cela signifie qu’il doit utiliser le nom du moniker racine ajouté à « _Resolution.xsd ».
(Facultatif) Générez une classe à partir du nouveau schéma et enregistrez-la dans l’assembly de programme de résolution personnalisé. Cela expose les paramètres typés dans le programme de résolution personnalisé.
Inscrivez le nouvel assembly dans le Global Assembly Cache.