Ссылка на порт в оркестрации через строковую переменную

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

Вопрос

Я пытаюсь разработать универсальное приложение BizTalk для настройки динамических портов.У меня есть оркестровка, которая возвращает все параметры конфигурации для каждого порта, и я хочу просмотреть эти параметры и настроить порты.Настройки хранятся в MSSQL, и, например, два свойства — PortName и Address.Поэтому изнутри оркестрации я хотел бы ссылаться на порт с помощью строковой переменной PortName.Итак, есть ли способ получить коллекцию всех портов в оркестрации или сослаться на порт через строковую переменную, т.е. Port['MyPortName'](Microsoft.XLANGs.BaseTypes.Address) = "file://c:\test\out\%MessageId%.xml" Спасибо

Это было полезно?

Решение

В первую очередь вы не должны пытаться выполнять изменения конфигурации, как это, используя оркестровку.Технически это возможно делать то, что вы пытаетесь сделать, но как практика, вы не должны смешивать свой бизнес-процесс с администрацией.

Лучший способ сделать такие вещи, либо пишу некоторые обычные сценарии или PowerShell.

Чтобы ответить на вопрос, вы можете получить данные, которые вы хотите от класса BtsorChestration в Explorerom http://msdn.microsoft.com / ru-us / Библиотека / microsoftibiztalk.explorem.btsorchestration_members (v= bts.20)

Другие советы

Чтобы динамически настраивать динамические логические порты отправки из оркестрации, необходимо сохранить настройки в постоянном хранилище данных (например,базу данных или файл конфигурации) и реализовать способ динамического назначения этих свойств во время выполнения.

Но сначала нам нужно понять, что происходит при настройке порта динамической отправки.

Как настроить динамический логический порт отправки

Настройка свойств динамического логического порта отправки изнутри оркестровки включает в себя два этапа:

  • Во-первых, Тип транспорта и цель Адрес Свойства должны быть указаны для порта отправки.Обычно это делается в Форма выражения с кодом, подобным этому:

    DynamicSendPort(Microsoft.XLANGs.BaseTypes.TransportType) = "ФАЙЛ";DynamicSendPort(Microsoft.XLANGs.BaseTypes.Address) = "C: emp\Folder\%SourceFileName%";

  • Во-вторых, любые дополнительные свойства транспорта должны быть указаны в контексте самого исходящего сообщения.Практически все адаптеры BizTalk имеют дополнительные свойства которые используются для связи между механизмом обмена сообщениями и механизмом оркестрации XLANG/s.Например, Имя полученного файла Свойство context используется для динамической установки определенного имени, когда адаптер FILE сохранит исходящее сообщение в его целевом расположении.Лучше всего это выполнять внутри Форма назначения, как часть построения исходящего сообщения:

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

Вы заметите, что большинство свойств конфигурации необходимо указывать в контексте исходящих сообщений, указывая префикс пространства имен (например,ФАЙЛ), имя свойства (например.ReceiveFileName) и, очевидно, значение, которое присваивается соответствующему свойству.

Фактически, все свойства контекста являются классами, которые живут внутри известный Microsoft.BizTalk.GlobalPropertySchemas.dll сборка.Это подтверждается поиском этой сборки в обозревателе объектов Visual Studio.

FILE.ReceivedFileName in Microsoft.BizTalk.GlobalPropertySchemas.dll

Несмотря на то, что большинство свойств контекста, необходимых для настройки динамических логических портов отправки, находятся внутри этой конкретной сборки, не все из них находятся внутри этой конкретной сборки.Например, адаптер MSMQ BizTalk использует отдельную сборку для хранения свойств контекста.Очевидно, что адаптеры сторонних производителей или собственные адаптеры также поставляются с дополнительными сборками.

Таким образом, чтобы настроить свойство контекста на порту динамической отправки с использованием гибкого подхода, подобного описанному ниже, необходимы четыре части информации:

  • Полное имя сборки, содержащей классы свойств контекста.
  • Префикс пространства имен.
  • Имя свойства.
  • Стоимость недвижимости.

Сохранение настроек порта на постоянном носителе

Следующая схема .XSD иллюстрирует одну из возможных структур для сериализации настроек порта.

ContextProperties XML Schema Definition

После сериализации указанные свойства контекста можно легко сохранить в базе данных SQL или файле конфигурации.Например, вот настройки, используемые в качестве примера в этом посте:

Example of ContextProperties Settings

Гибкий подход к настройке динамических логических портов отправки

С помощью простой вспомогательной библиотеки настроить динамическую конфигурацию порта очень просто.Сначала вам необходимо получить сериализованные настройки с постоянного носителя.Этого можно легко достичь с помощью адаптера WCF-SQL и простой хранимой процедуры.

После получения эти свойства можно десериализовать в строго типизированный граф объектов C#.Для этого сначала создайте представление C# схемы ContextProperties, показанной выше, с помощью следующей утилиты командной строки:

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

При этом создается частичный класс, который можно улучшить с помощью следующего метода:

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

Во-вторых, применение этой конфигурации включает в себя создание сообщения XLANG/s из кода и динамическую настройку свойств контекста с использованием отражения на основе описания классов свойств контекста, указанных в десериализованном графе объектов ContextProperties.

Для этого я использую технику, позаимствованную у Паоло Сальваторисерия статей относительно динамических преобразований, который заключается в создании пользовательского BTXСообщение-производный класс, используемый внутри механизма 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);
        }

    }
}

Теперь последняя часть головоломки — как использовать этот пользовательский класс внутри оркестровки.Это легко сделать в Форма назначения используя следующий вспомогательный код:

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

Вы можете использовать этот статический метод внутри своего Форма назначения как код, показанный ниже, где OutboundMessage представляет сообщение, для которого вы хотите установить контекст:

OutboundMessage = Helper.Schemas.Message.SetContext(OutboundMessage, contextProperties);
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top