文字列変数を介したオーケストレーション内のポートを参照する
-
12-12-2019 - |
質問
動的ポートを設定するための一般的なBizTalkアプリケーションを開発しようとしています。私は各ポートのすべての構成設定を引き戻すオーケストレーションがあり、それらの設定をループしてポートを設定したいと考えています。設定はMSSQLで保持され、たとえば、2つのプロパティはポート名とアドレスです。それで、オーケストレーション内からの範囲内で、文字列変数ポート名によってポートを参照したいと思います。それで、すべてのポートのコレクションをオーケストレーション内のコレクションを取得するか、または文字列変数を介してポートを参照する方法はあります。
解決
最初の場所では、オーケストレーションを使用してこのような設定変更を試みるべきではありません。技術的には、あなたがしようとしていることをすることは可能ですが、練習としてあなたは管理プロセスを管理と混同してはいけません。
そのようなことをする最善の方法は、通常のスクリプトやPowerShellを書くことによって行われます。
あなたに答えるために、あなたが望むデータをExploreromで入手することができます http://msdn.microsoft..com / ja-us / library / Microsoft.biztalk.explorerom.btsorchestration_members(v= bts.20)
他のヒント
オーケストレーション内から動的論理送信ポートを動的に構成するには、その設定を永続データストア(データベースまたは構成ファイル)に保存し、実行時にそれらのプロパティを動的に割り当てる方法を実装する必要があります。
しかし最初に、動的送付ポートを設定するときに何が起こっているのかを理解する必要があります。
動的論理送信ポートを設定する方法
動的論理のプロパティの設定オーケストレーション内からポートを送信するには、2つのステップがあります。
-
最初の、 transporttype とターゲットアドレス送信ポートでプロパティを指定する必要があります。これは通常、これに似たコードを持つ式形状で行われます。
DynamicSendPort(Microsoft.xlangs.Basetypes.TransPortType)="file"; DynamicSendPort(Microsoft.xlangs.basetypes.Address)="C:\ Temp \ Folder \%SourceFileName%";
-
2番目のトランスポートプロパティは、発信メッセージ自体のコンテキストで指定する必要があります。実質的にすべてのBizTalkアダプタには、追加のプロパティ ReceivedFilename Contextプロパティは、ファイルアダプタがそのターゲットの場所で発信メッセージを保存するときに特定の名前を動的に設定するために使用されます。これは、発信メッセージを構築する部分として、割り当て形状内で最もよく実行されます。
OutGoingMessage(File.ReceiveFileName)="HardCodedFilename.xml"
そのため、以下に記述されている柔軟なアプローチを使用して動的送信ポートでコンテキストプロパティを設定するためには、4つの情報が必要です。
永続的なメディアにポート設定を格納する
次の.xsdスキーマは、ポート設定を直列化するための1つの可能な構造を示しています。
一旦シリアル化されたときに、指定されたコンテキストプロパティをSQLデータベースまたは設定ファイルに非常に簡単に保存できます。たとえば、この記事の例として使用される設定は次のとおりです。
単純なヘルパーライブラリを使用すると、動的ポート設定を設定することは非常に簡単です。まず、永続媒体からシリアル化された設定を取得する必要があります。これは、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 シリーズの記事を使用します。
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);
.