Domanda

Sto tentando di sviluppare un'applicazione generica BizTalk per configurare porti dinamici.Ho un'orchestrazione che tira indietro tutte le impostazioni di configurazione per ciascuna porta e voglio loop attraverso queste impostazioni e configurare le porte.Le impostazioni sono tenute in MSSQL e, ad esempio, due delle proprietà sono portaname e indirizzo.Quindi dall'interno dell'orchestrazione vorrei fare riferimento alla porta dal portname della variabile di stringa.Quindi c'è un modo per ottenere una raccolta di tutte le porte in un'orchestrazione o fare riferimento a una porta tramite una variabile stringa I.e. Port['MyPortName'](Microsoft.XLANGs.BaseTypes.Address) = "file://c:\test\out\%MessageId%.xml" Grazie

È stato utile?

Soluzione

In primo luogo non dovresti tentare di fare modifiche alla configurazione come questa usando un'orchestrazione.Tecnicamente è fattibile fare ciò che stai tentando di fare, ma come pratica non dovresti confondere il tuo processo aziendale con l'amministrazione.

Il modo migliore per fare tali cose saranno scritte o scrivendo alcuni script normali o PowerShell.

Per rispondere alla tua domanda, puoi ottenere i dati che desideri dalla classe BtSorchestration in Explorerom http://msdn.microsoft.com / en-noi / libreria / microsoft.biztalk.explorerom.btsorchestration_members (v= bts.20)

Altri suggerimenti

Per configurare dinamicamente le porte di invio logiche dinamiche da un'orchestrazione, è necessario memorizzare le impostazioni in un datastore persistente (ad esempio un database o un file di configurazione) e implementare un modo per assegnare tali proprietà dinamicamente in fase di esecuzione. Ma prima, dobbiamo capire cosa sta succedendo quando si configura una porta di invio dinamica.

Come configurare una porta di invio logica dinamica

Configurazione delle proprietà di un logico dinamico Invia porta da un orchestrazione coinvolge due passaggi:

noterai che la maggior parte delle proprietà di configurazione deve essere specificata nel contesto dei messaggi in uscita, specificando un prefisso dei nomi (ad es. File), un nome della proprietà (ad es. Ricezione FileName) e, ovviamente, il valore che viene assegnato al corrispondente proprietà.

In effetti, tutte le proprietà del contesto sono classi che vivono all'interno del gruppo ben noto Microsoft.BizTalk.GlobalPropertySchemas.dll Assembly. Questo è confermato guardando questo assemblaggio in Visual Studio's Object Explorer.

file.receivedfilename in microsoft.biztalk.globalpropertyschemas.dll

Anche se la maggior parte delle proprietà del contesto necessaria per configurare le porte di invio logiche dinamiche vivono all'interno di questo assembly specifico, non tutti fanno. Ad esempio, l'adattatore MSMQ BizTalk utilizza un assembly separato per memorizzare le proprietà di contesto. Ovviamente, gli adattatori di terze parti o personalizzati sono dotati anche di assemblee aggiuntivi.

Pertanto, al fine di configurare una proprietà di contesto su una porta di invio dinamica utilizzando un approccio flessibile come quello descritto di seguito, sono necessarie quattro informazioni:

Memorizzazione delle impostazioni della porta in un mezzo persistente

Il seguente schemaXSD Schema illustra una possibile struttura per la serializzazione delle impostazioni della porta.

ContextProperties XML Schema Definizione

Una volta serializzato, le proprietà del contesto specificate possono quindi essere memorizzate in un database SQL o in un file di configurazione molto facilmente. Ad esempio, ecco le impostazioni utilizzate come esempio in questo post:

Esempio di contesti di contextproperties

Un approccio flessibile per configurare le porte di invio logico dinamico

Con una biblioteca di supporto semplice, la configurazione della configurazione della porta dinamica è molto semplice. Innanzitutto, è necessario recuperare le impostazioni serializzate dal supporto persistente. Questo può essere facilmente raggiunto utilizzando l'adattatore WCF-SQL e una semplice procedura memorizzata.

Una volta recuperati, tali proprietà possono quindi essere deserialilizzate in un grafico oggetto C # fortemente digitato. Per questo, creare prima una rappresentazione C # dello schema ContextProperties mostrato sopra, utilizzando la seguente utility della riga di comando:

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

Genera una classe parziale che può essere migliorata con il seguente metodo:

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);
        }
    }
}
.

Secondo, applicare questa configurazione prevede la creazione di un messaggio Xlang / s dal codice e configurare le proprietà del contesto utilizzando dinamicamente la riflessione, in base alla descrizione delle classi di proprietà del contesto specificate nel deserializ

Ed ContextProperties Object grafico.

Per questo, uso una tecnica presa in prestito da Paolo Salvatori Serie di articoli Per quanto riguarda le trasformazioni dinamiche , il che consiste nella creazione di un btxmessage class class, usato internamente dal motore BizTalk Xlang / s.

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);
        }

    }
}
.

Ora, l'ultimo pezzo del puzzle è come utilizzare questa classe personalizzata da un'orchestrazione. Questo è facilmente fatto in una forma di assegnazione utilizzando il seguente codice Helper:

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();
            }
        }
    }
}
.

È possibile utilizzare questo metodo statico all'interno della forma assegnazione come il codice mostrato di seguito, in cui OutboundMessage rappresenta il messaggio che si desidera impostare il contesto:

OutboundMessage = Helper.Schemas.Message.SetContext(OutboundMessage, contextProperties);
.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top