Fare riferimento a una porta in un'orchestrazione tramite una variabile stringa
-
12-12-2019 - |
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
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:
- .
-
Prima, il TransportType e bersaglio Indirizzo Le proprietà devono essere specificate sulla porta di invio. Questo di solito è fatto in una forma di espressione con codice simile a questo:
dinamicsendport (microsoft.xlangs.basetipes.transporttype)="file"; DynamicSendport (microsoft.xlangs.basetipes.address)="c: \ temp \ folder \% souryfilename%";
-
Secondo, eventuali proprietà di trasporto aggiuntive devono essere specificate nel contesto del messaggio in uscita stesso. Praticamente tutti gli adattatori BizTalk hanno Proprietà aggiuntive che vengono utilizzati per la comunicazione tra il motore di messaggistica e il motore di orchestrazione Xlang / s. Per esempio, il RicevyFileName La proprietà contestuale viene utilizzata per impostare dinamicamente un nome specifico per quando il file Adapter salverà il messaggio in uscita nella posizione di destinazione. Questo è meglio eseguito all'interno di una forma di assegnazione , come parte della costruzione del messaggio in uscita:
Outgoingmessage (file.receivefilename)="hardcodedfilename.xml"
Memorizzazione delle impostazioni della porta in un mezzo persistente
Il seguente schemaXSD Schema illustra una possibile struttura per la serializzazione delle impostazioni della porta.
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:
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);
.