Le référencement d'un port dans une orchestration par l'intermédiaire d'une variable de chaîne

StackOverflow https://stackoverflow.com//questions/10686309

Question

Je suis d'essayer de développer un générique de l'application BizTalk pour la configuration des ports dynamiques.J'ai une orchestration qui retire tous les paramètres de configuration pour chaque port et je veux faire une boucle par ces paramètres et de configurer les ports.Les paramètres sont stockés dans MSSQL et, par exemple, deux des propriétés de nom de port et l'Adresse.Donc, à partir de l'intérieur de l'orchestration, je voudrais référence du port de la variable de chaîne de nom de port.Donc, est-il un moyen d'obtenir une collection de tous les ports dans une orchestration de référence ou d'un port via une variable de chaîne c'est à dire Port['MyPortName'](Microsoft.XLANGs.BaseTypes.Address) = "file://c:\test\out\%MessageId%.xml" Merci

Était-ce utile?

La solution

En premier lieu, vous ne devriez pas tenter de faire des changements de configuration comme ceci en utilisant une Orchestration.Techniquement, c'est faisable de faire ce que vous tentez de le faire, mais comme une pratique, vous ne devriez pas mélanger vos processus d'affaires avec l'administration.

La meilleure façon de faire ce genre de choses va être soit par l'écriture de scripts normaux ou PowerShell.

Pour répondre à votre question, vous pouvez obtenir les données que vous voulez à partir de BtsOrchestration classe dans ExplorerOM http://msdn.microsoft.com/en-us/library/microsoft.biztalk.explorerom.btsorchestration_members(v=bts.20)

Autres conseils

Afin de configurer dynamiquement à la Dynamique de la Logique d'Envoyer des Ports de l'intérieur d'une orchestration, on doit stocker les paramètres dans une banque de données persistantes (par ex.une base de données ou un fichier de configuration) et de mettre en œuvre un moyen d'affecter les propriétés dynamiquement à l'exécution.

Mais d'abord, nous avons besoin de comprendre ce qui se passe quand configurant un Port d'envoi Dynamique.

Comment Configurer une Dynamique Logique de Port d'envoi

Configuration des propriétés d'une dynamique logique de port d'envoi dans une orchestration comporte deux étapes:

  • Tout d'abord, l' TransportType et la cible Adresse propriétés doit être spécifié sur le Port d'envoi.Cela se fait habituellement dans une Forme D'Expression avec un code similaire à ceci:

    DynamicSendPort(Microsoft.XLANGs.BaseTypes.TransportType) = "FICHIER";DynamicSendPort(Microsoft.XLANGs.BaseTypes.Adresse) = "C: emp\Folder\%SourceFileName%";

  • Deuxièmement, tous les autres propriétés de transport doit être spécifié sur le contexte du message sortant lui-même.Pratiquement tous les adaptateurs BizTalk ont des propriétés supplémentaires qui sont utilisés pour la communication entre le Moteur de Messagerie et le XLANG/s Moteur d'Orchestration.Par exemple, l' ReceivedFileName contexte de la propriété est utilisée pour définir dynamiquement un nom spécifique pour quand le FICHIER carte enregistrez le message sortant à son emplacement cible.C'est préférable d'effectuer à l'intérieur d'un Forme D'Assignation, dans le cadre de la construction du message sortant:

    OutgoingMessage(FICHIER.ReceiveFileName) = "HardCodedFileName.xml"

Vous remarquerez que la plupart des propriétés de configuration doit être spécifié sur le contexte des messages sortants, la spécification d'un préfixe d'espace de noms (par ex.FICHIER), un nom de propriété (p. ex.ReceiveFileName) et, évidemment, la valeur qui sera affectée à la propriété correspondante.

En fait, toutes les propriétés de contexte sont des classes qui vivent à l'Intérieur de la bien connu Microsoft.BizTalk.GlobalPropertySchemas.dll de l'assemblée.Ceci est confirmé par la recherche de cette assemblée dans Visual Studio, de l'explorateur d'objets.

FILE.ReceivedFileName in Microsoft.BizTalk.GlobalPropertySchemas.dll

Même si la plupart des propriétés de contexte qui sont nécessaires à la configuration Dynamique de la Logique d'Envoyer des Ports vivre à l'Intérieur de cette assemblée, pas tous les faire.Par exemple, le MSMQ adaptateur BizTalk utilise une assemblée distincte pour stocker ses propriétés de contexte.De toute évidence, à un tiers ou à des adaptateurs personnalisés venir avec un complément d'assemblages ainsi.

Par conséquent, afin de paramétrer un contexte de propriété sur un Port d'envoi Dynamique à l'aide d'une approche flexible comme celui décrit ci-dessous, quatre éléments d'information sont nécessaires:

  • Le nom complet de l'assemblée contenant le contexte de la propriété des classes.
  • Le préfixe d'espace de noms.
  • Le nom de la propriété.
  • La valeur de la propriété.

Stockage des Paramètres de Port dans une persistance de la Moyenne

La suite .Schéma XSD illustrer une structure possible pour la sérialisation des paramètres de port.

ContextProperties XML Schema Definition

Une fois activé, le contexte spécifié propriétés peuvent ensuite être stockées dans une base de données SQL ou un fichier de configuration très facilement.Par exemple, voici les paramètres utilisés comme un exemple dans ce post:

Example of ContextProperties Settings

Une Approche Flexible pour la Configuration Dynamique de la Logique d'Envoyer des Ports

Avec une simple Bibliothèque d'aide, le réglage de la dynamique de la configuration du port est très facile.Tout d'abord, vous devez récupérer le sérialisé paramètres de la persistance de la moyenne.Cela peut facilement être réalisé à l'aide de la WCF-Adaptateur SQL et une simple procédure stockée.

Une fois récupérées, ces propriétés peuvent être désérialisée dans un typage fort C# de l'objet graphique.Pour cela, créez d'abord une représentation C# de la ContextProperties schéma illustré ci-dessus, à l'aide de la commande suivante en ligne de l'utilitaire:

xsd.exe /classes /language:cs /namespace:Helper.Schemas .\ContextProperties.xsd

Cela génère une classe partielle qui peut être améliorée avec la méthode suivante:

namespace Helper.Schemas
{
    public partial class ContextProperties
    {
        public static ContextProperties Deserialize(string text)
        {
            using (MemoryStream stream = new MemoryStream())
            {
                byte[] buffer = Encoding.UTF8.GetBytes(text);
                stream.Write(buffer, 0, buffer.Length);
                stream.Seek(0, SeekOrigin.Begin);
                return (ContextProperties) 
                    Deserialize(
                          stream
                        , typeof(ContextProperties));
            }
        }

        public static Object Deserialize(Stream stream, Type type)
        {
            XmlSerializer xmlSerializer = new XmlSerializer(type);
            return xmlSerializer.Deserialize(stream);
        }
    }
}

Deuxièmement, l'application de cette configuration implique la création d'un XLANG/s message de code et de configuration de l'propriétés de contexte dynamiquement à l'aide de la réflexion, basée sur la description du contexte de la propriété des classes indiquées dans le désérialisé ContextProperties objet graphique.

Pour cela, j'utilise une technique empruntée Paolo Salvatori's série d'articles concernant la dynamique des transformations, qui consiste à créer une personnalisée BTXMessageclasse dérivée, utilisé en interne par le BizTalk XLANG/s moteur.

namespace Helper.Schemas
{
    using Microsoft.BizTalk.XLANGs.BTXEngine; // Found in Microsoft.XLANGs.BizTalk.Engine
    using Microsoft.XLANGs.Core; // Found in Microsoft.XLANGs.Engine

    [Serializable]
    public sealed class CustomBTXMessage : BTXMessage
    {
        public CustomBTXMessage(string messageName, Context context)
            : base(messageName, context)
        {
            context.RefMessage(this);
        }

        public void SetContextProperty(string assembly, string ns, string name, object value)
        {
            if (String.IsNullOrEmpty(ns))
                ns = "Microsoft.XLANGs.BaseTypes";
            if (String.IsNullOrEmpty(assembly))
                assembly = "Microsoft.BizTalk.GlobalPropertySchemas";

            StringBuilder assemblyQualifiedName = new StringBuilder();
            assemblyQualifiedName.AppendFormat("{0}.{1}, {2}", ns, name, assembly);

            Type type = Type.GetType(assemblyQualifiedName.ToString(), true, true);
            SetContextProperty(type, value);
        }

        internal void SetContextProperty(string property, object value)
        {
            int index = property.IndexOf('.');
            if (index != -1)
                SetContextProperty(String.Empty, property.Substring(0, index), property.Substring(index + 1), value);
            else
                SetContextProperty(String.Empty, String.Empty, property, value);
        }

    }
}

Maintenant, la dernière pièce du puzzle est de savoir comment utiliser cette classe personnalisée à partir d'une Orchestration.Ceci se fait facilement en une Forme D'Assignation à l'aide de l'assistance suivante de code:

namespace Helper.Schemas
{
    using Microsoft.XLANGs.BaseTypes;
    using Microsoft.XLANGs.Core; // Found in Microsoft.XLANGs.Engine

    public static class Message
    {
        public static XLANGMessage SetContext(XLANGMessage message, ContextProperties properties)
        {
            try
            {
                // create a new XLANGMessage

                CustomBTXMessage customBTXMessage = new CustomBTXMessage(message.Name, Service.RootService.XlangStore.OwningContext);

                // add parts of the original message to it

                for (int index = 0; index < message.Count; index++)
                    customBTXMessage.AddPart(message[index]);

                // set the specified context properties

                foreach (ContextPropertiesContextProperty property in properties.ContextProperty)
                    customBTXMessage.SetContextProperty(property.assembly, property.@namespace, property.name, property.Value);

                return customBTXMessage.GetMessageWrapperForUserCode();
            }

            finally
            {
                message.Dispose();
            }
        }
    }
}

Vous pouvez utiliser cette méthode statique à l'intérieur de votre Forme D'Assignation comme le code indiqué ci-après, où OutboundMessage représente le message dont vous souhaitez définir le contexte:

OutboundMessage = Helper.Schemas.Message.SetContext(OutboundMessage, contextProperties);
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top