سؤال

أحاول تطوير تطبيق بيزتالك عام لتكوين المنافذ الديناميكية.لدي تزامن يسحب جميع إعدادات التكوين لكل منفذ وأريد أن حلقة من خلال هذه الإعدادات وتكوين المنافذ.يتم الاحتفاظ بالإعدادات في مسكل ، وعلى سبيل المثال ، اثنان من الخصائص هما اسم المنفذ والعنوان.لذلك من داخل التزامن أود أن أشير إلى المنفذ بواسطة اسم منفذ متغير السلسلة.فهل هناك طريقة ما للحصول على مجموعة من جميع المنافذ في تزامن أو مرجع منفذ عبر متغير سلسلة أي. Port['MyPortName'](Microsoft.XLANGs.BaseTypes.Address) = "file://c:\test\out\%MessageId%.xml" شكرا

هل كانت مفيدة؟

المحلول

في المقام الأول يجب أن لا تحاول أن تفعل تغييرات التكوين مثل هذا باستخدام تزامن.من الناحية الفنية ، من الممكن أن تفعل ما تحاول القيام به ، ولكن كممارسة يجب ألا تخلط بين عملية عملك والإدارة.

أفضل طريقة للقيام بمثل هذه الأشياء ستكون إما عن طريق كتابة بعض النصوص العادية أو بوويرشيل.

للإجابة على سؤالك ، يمكنك الحصول على البيانات التي تريدها من فئة بتسورشيستراتيون في إكسبلوريروم http://msdn.microsoft.com/en-us/library/microsoft.biztalk.explorerom.btsorchestration_members(v=bts.20)

نصائح أخرى

من أجل تكوين منافذ الإرسال المنطقية الديناميكية ديناميكيا من داخل تنسيق ، يتعين على المرء تخزين الإعدادات في مخزن بيانات ثابت (على سبيل المثال.قاعدة بيانات أو ملف تكوين) وتنفيذ طريقة لتعيين هذه الخصائص ديناميكيا في وقت التشغيل.

لكن أولا ، نحتاج إلى فهم ما يحدث عند تكوين منفذ إرسال ديناميكي.

كيفية تكوين منفذ إرسال منطقي ديناميكي

تكوين خصائص منفذ إرسال منطقي ديناميكي من داخل تزامن ينطوي على خطوتين:

  • أولا ، نوع النقل والهدف العنوان يجب تحديد الخصائص على منفذ الإرسال.يتم ذلك عادة في شكل التعبير مع رمز مماثل لهذا:

    ديناميكسبورت (مايكروسوفت.إكسلانجس.أنواع أساسية.نوع النقل) ="ملف";ديناميكسبورت (مايكروسوفت.إكسلانجس.أنواع أساسية.العنوان) = "C: emp\Folder\%SourceFileName٪";

  • ثانيا ، يجب تحديد أي خصائص نقل إضافية في سياق الرسالة الصادرة نفسها.تقريبا جميع محولات بيزتالك لديها خصائص إضافية التي تستخدم للاتصال بين محرك الرسائل و زلانغ/ق محرك تزامن.على سبيل المثال ، تلقى اسم الفيلم يتم استخدام خاصية السياق لتعيين اسم محدد ديناميكيا عندما يقوم محول الملف بحفظ الرسالة الصادرة في موقعه المستهدف.هذا هو أفضل أداء داخل شكل المهمة, ، كجزء من إنشاء الرسالة الصادرة:

    المصروفرسالة (ملف.ريسيفيفيلنام) = "هاردكوددفيلنام.شمل"

ستلاحظ أنه يجب تحديد معظم خصائص التكوين في سياق الرسائل الصادرة ، مع تحديد بادئة مساحة الاسم (على سبيل المثال.ملف) ، اسم خاصية (على سبيل المثال.ريسيفيلنام) ، ومن الواضح أن القيمة التي يحصل على تعيين إلى الممتلكات المقابلة.

في الواقع ، جميع خصائص السياق هي الطبقات التي تعيش داخل معروف Microsoft.BizTalk.GlobalPropertySchemas.dll الجمعية.يتم تأكيد ذلك من خلال البحث عن هذا التجميع في مستكشف الكائنات فيسوال ستوديو.

FILE.ReceivedFileName in Microsoft.BizTalk.GlobalPropertySchemas.dll

على الرغم من أن معظم خصائص السياق الضرورية لتكوين منافذ الإرسال المنطقية الديناميكية تعيش داخل هذا التجميع المحدد ، إلا أنها لا تفعل جميعها.على سبيل المثال ، يستخدم محول مسمق بيزتالك تجميع منفصل لتخزين خصائص السياق الخاصة به.من الواضح أن محولات الطرف الثالث أو المخصصة تأتي مع تجميعات إضافية أيضا.

لذلك ، من أجل إعداد خاصية السياق على منفذ إرسال ديناميكي باستخدام نهج مرن مثل واحد وصف أدناه ، أربع قطع من المعلومات ضرورية:

  • الاسم المؤهل بالكامل للتجميع الذي يحتوي على فئات خصائص السياق.
  • بادئة مساحة الاسم.
  • اسم العقار.
  • قيمة العقار.

تخزين إعدادات المنفذ في وسط ثابت

ما يلي .مخطط شسد توضيح بنية واحدة ممكنة لتسلسل إعدادات المنفذ.

ContextProperties XML Schema Definition

مرة واحدة تسلسل ، يمكن بعد ذلك تخزين خصائص السياق المحدد في قاعدة بيانات سكل أو ملف التكوين بسهولة جدا.على سبيل المثال ، إليك الإعدادات المستخدمة كمثال في هذا المنشور:

Example of ContextProperties Settings

نهج مرن لتكوين منافذ إرسال منطقية ديناميكية

باستخدام مكتبة مساعدة بسيطة ، يعد إعداد تكوين المنفذ الديناميكي أمرا سهلا للغاية.أولا ، يجب عليك استرداد الإعدادات المتسلسلة من الوسيط الثابت.ويمكن تحقيق ذلك بسهولة باستخدام محول وف-سكل وإجراء تخزين بسيط.

بمجرد استرجاعها ، يمكن بعد ذلك إلغاء تسلسل هذه الخصائص في رسم بياني لكائن ج# مكتوب بقوة.لهذا ، قم أولا بإنشاء تمثيل ج # لمخطط كونتيكستبروبيرتيز الموضح أعلاه ، باستخدام الأداة المساعدة سطر الأوامر التالية:

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

ثانيا ، تطبيق هذا التكوين ينطوي على إنشاء رسالة زلانغ / ثانية من التعليمات البرمجية وإعداد خصائص السياق ديناميكيا باستخدام الانعكاس ، استنادا إلى وصف فئات خصائص السياق المحددة في الرسم البياني كائن كونتيكستبروبيرتيز ديسيرياليزد.

لهذا ، أستخدم تقنية مستعارة من باولو سالفاتوريسلسلة المقالات فيما يتعلق بالتحولات الديناميكية, ، والتي تتمثل في إنشاء مخصص بتكسميساج- فئة مشتقة ، تستخدم داخليا من قبل محرك بيزتالك زلانغ / ثانية.

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