質問

動的ポートを設定するための一般的なBizTalkアプリケーションを開発しようとしています。私は各ポートのすべての構成設定を引き戻すオーケストレーションがあり、それらの設定をループしてポートを設定したいと考えています。設定はMSSQLで保持され、たとえば、2つのプロパティはポート名とアドレスです。それで、オーケストレーション内からの範囲内で、文字列変数ポート名によってポートを参照したいと思います。それで、すべてのポートのコレクションをオーケストレーション内のコレクションを取得するか、または文字列変数を介してポートを参照する方法はあります。

役に立ちましたか?

解決

最初の場所では、オーケストレーションを使用してこのような設定変更を試みるべきではありません。技術的には、あなたがしようとしていることをすることは可能ですが、練習としてあなたは管理プロセスを管理と混同してはいけません。

そのようなことをする最善の方法は、通常のスクリプトやPowerShellを書くことによって行われます。

あなたに答えるために、あなたが望むデータをExploreromで入手することができます http://msdn.microsoft..com / ja-us / library / Microsoft.biztalk.explorerom.btsorchestration_members(v= bts.20)

他のヒント

オーケストレーション内から動的論理送信ポートを動的に構成するには、その設定を永続データストア(データベースまたは構成ファイル)に保存し、実行時にそれらのプロパティを動的に割り当てる方法を実装する必要があります。

しかし最初に、動的送付ポートを設定するときに何が起こっているのかを理解する必要があります。

動的論理送信ポートを設定する方法

動的論理のプロパティの設定オーケストレーション内からポートを送信するには、2つのステップがあります。

ほとんどの設定プロパティを発信メッセージのコンテキストで指定し、名前空間プレフィックス(ファイルなど)、プロパティ名(receiveFileName)、または明らかに、対応する値に割り当てられる値を指定する必要があることに気付くでしょう。財産。

実際には、すべてのコンテキストプロパティは、既知の Microsoft.BizTalk.GlobalPropertySchemas.dllアセンブリ内部に住んでいるクラスです。これはVisual Studioのオブジェクトエクスプローラでこのアセンブリを調べることによって確認されます。

microsoft.biztalk.globalPropertyschemas.dll

のalt="file.receivedFileName"

動的論理送信ポートを構成するのに必要なほとんどのコンテキストプロパティでも、この特定のアセンブリ内にライブが生まれています。たとえば、MSMQ BizTalkアダプタは、そのコンテキストプロパティを格納するために別々のアセンブリを使用します。明らかに、サードパーティまたはカスタムアダプタにも付着アセンブリが付属しています。

そのため、以下に記述されている柔軟なアプローチを使用して動的送信ポートでコンテキストプロパティを設定するためには、4つの情報が必要です。

永続的なメディアにポート設定を格納する

次の.xsdスキーマは、ポート設定を直列化するための1つの可能な構造を示しています。

ContextProperties XMLスキーマ定義

一旦シリアル化されたときに、指定されたコンテキストプロパティをSQLデータベースまたは設定ファイルに非常に簡単に保存できます。たとえば、この記事の例として使用される設定は次のとおりです。

ContextProperties設定の例

動的論理送信ポートを設定するための柔軟なアプローチ

単純なヘルパーライブラリを使用すると、動的ポート設定を設定することは非常に簡単です。まず、永続媒体からシリアル化された設定を取得する必要があります。これは、WCF-SQLアダプタとシンプルなストアドプロシージャを使用して簡単に実現できます。

取得したら、それらのプロパティを強く型付けされたC#オブジェクトグラフに逆シリアル化できます。このために、最初に、次のコマンドラインユーティリティを使用して、上記のContextPropertiesスキーマのC#表現を作成します。

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

2秒で、この構成を適用するには、Deserializで指定されたコンテキストプロパティクラスの説明に基づいて、コードからXlang / Sメッセージを作成し、コンテキストプロパティを動的に設定することが含まれます。

ED ContextPropertiesオブジェクトグラフ。

このため、私は Paolo Salvatori シリーズの記事を使用します。 BTXMessage - 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